GNU/Linux >> Linux Esercitazione >  >> FreeBSD

Freebsd – Bsd Sed:sostituire solo l'ennesima occorrenza di uno schema?

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 ogni N ext nello spazio del modello, facendo s comando sostitutivo per 2 solo nd occorrenza. t est se la sostituzione riesce o meno. Se sì, ci imbattiamo nel ciclo :2 , altrimenti ripeti il ​​ciclo con b1 .

  • 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.


FreeBSD
  1. Sostituisci le virgolette intelligenti con il comando sed di Linux

  2. Restituisci solo la stringa abbinata in Sed?

  3. Trova il numero di riga che contiene il modello utilizzando il delimitatore Regex personalizzato?

  4. Schema di sostituzione dopo l'ennesima corrispondenza trovata su ogni riga??

  5. Restituire solo la parte di una linea dopo uno schema corrispondente?

I 20 migliori comandi sed da usare

Come sostituire una stringa in un file?

Inserimento di un file in un altro file dopo la prima occorrenza di un pattern?

Mantenere solo la prima riga da ogni sequenza di righe consecutive che corrispondono a uno schema?

Trova solo la prima occasione usando solo Grep?

Sostituzione Sed multilinea