Utilizzo di BSD sed
;
Come posso eseguire la seguente sostituzione?:
Prima:
hello hello hello
hello hello hello
Dopo:
hello world hello
hello hello hello
In altre parole; come posso sostituire solo il N il evento di un modello?
(O in questo caso; il 2 e evento di uno schema?)
Risposta accettata:
Con qualsiasi sed
POSIX :
$ sed -e'/hello/{' -e:1 -e'$!N;s/hello/world/2;t2' -eb1 -e\} -e:2 -en\;b2 <file
hello world hello
hello hello hello
-
Dopo la prima corrispondenza
/hello/
, ci imbattiamo in un ciclo. -
All'interno del ciclo
:1
, leggiamo ogniN
ext nello spazio del modello, facendos
comando sostitutivo per2
solo nd occorrenza.t
est se la sostituzione riesce o meno. Se sì, ci imbattiamo nel ciclo:2
, altrimenti ripeti il ciclo conb1
. -
All'interno del ciclo
:2
, stampiamo solo le righe rimanenti fino alla fine del file.
Nota che questo approccio memorizzerà tutte le cose tra due ciao nello spazio del modello. Sarà un problema con file enormi, quando il primo e il secondo sono lontani l'uno dall'altro.