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.