2013-04-06 21 views
75

Se corro questo codice in bash:Perché sed non sostituisce tutte le occorrenze?

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

dà uscita:

log dog dos 

Come posso farlo sostituire tutte le occorrenze di cane?

+2

È necessario il flag 'G' per la sostituzione globale, non è necessario l'opzione' -r' neanche qui . –

risposta

122

si dovrebbe aggiungere il modificatore g in modo che sed esegue un globale sostituzione del contenuto del buffer modello :

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

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

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

+0

Grazie, ha funzionato :) – niagr

18

Bisogna mettere un g alla fine, si distingue 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. –

+0

@DylanDaniels Secondo 'man sed' su Ubuntu, l'opzione' -r' significa "usa le espressioni regolari estese". Quindi il comando dato funziona bene, anche se non ha bisogno che funzionino le caratteristiche delle espressioni regolari estese. –

Problemi correlati