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 ogniNext nello spazio del modello, facendoscomando sostitutivo per2solo nd occorrenza.test 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.