Perché sed non sostituisce tutte le occorrenze?


118

Se eseguo questo codice in bash:

echo dog dog dos | sed -r 's:dog:log:'

dà output:

log dog dos

Come posso fare in modo che sostituisca tutte le occorrenze del cane?


2
Hai bisogno della gbandiera per la sostituzione globale, non hai nemmeno bisogno -rdell'opzione qui.
— Chris Seymour

Risposte:


188

Dovresti aggiungere il gmodificatore in modo che sed esegua una sostituzione globale del contenuto del buffer del pattern:

echo dog dog dos | sed -e 's:dog:log:g'

Per una fantastica documentazione su sed, controlla http://www.grymoire.com/Unix/Sed.html . Questo flag globale è spiegato qui: http://www.grymoire.com/Unix/Sed.html#uh-6

La documentazione ufficiale per GNU sedè disponibile su http://www.gnu.org/software/sed/manual/


1
L'aggiunta di un caso d'angolo per GNU sed qui: sed -E 's,foo,bar,g'non fa la cosa globale. Se lo cambi in sed -E -e 's,foo,bar,g'funziona.
— Melvyn Sopacua

23

Devi mettere un galla fine, sta per "globale":

echo dog dog dos | sed -r 's:dog:log:g'
                                     ^

1
sed -e dovrebbe essere usato al posto di sed -r, che non esiste.
— Dylan Daniels

1
@DylanDaniels Secondo man sedUbuntu, l' -ropzione significa "usa espressioni regolari estese". Quindi il comando fornito funziona bene, anche se non necessita delle funzionalità delle espressioni regolari estese per funzionare.
— Craig McQueen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.