Dlaczego sed nie zastępuje wszystkich wystąpień?

118

Jeśli uruchomię ten kod w bash:

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

daje wynik:

log dog dos

Jak mogę zastąpić wszystkie wystąpienia psa?

Nishant George Agrwal
źródło
2
Potrzebujesz gflagi do globalnego zastępowania, tutaj też nie potrzebujesz tej -ropcji.
Chris Seymour,

Odpowiedzi:

188

Powinieneś dodać gmodyfikator, aby sed wykonywał globalne podstawienie zawartości bufora wzorca:

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

Fantastyczną dokumentację na temat seda znajdziesz pod adresem http://www.grymoire.com/Unix/Sed.html . Ta globalna flaga została wyjaśniona tutaj: http://www.grymoire.com/Unix/Sed.html#uh-6

Oficjalna dokumentacja programu GNU sedjest dostępna pod adresem http://www.gnu.org/software/sed/manual/

Bruno Reis
źródło
1
Dodanie tutaj narożnika dla GNU sed: sed -E 's,foo,bar,g'nie robi rzeczy globalnej. Jeśli to zmienisz, sed -E -e 's,foo,bar,g'to działa.
Melvyn Sopacua,
23

Na gkońcu trzeba umieścić „globalny”:

echo dog dog dos | sed -r 's:dog:log:g'
                                     ^
alestanis
źródło
1
sed -e powinno być używane zamiast sed -r, które nie istnieje.
Dylan Daniels,
1
@DylanDaniels Zgodnie z man sedUbuntu -ropcja oznacza „użyj rozszerzonych wyrażeń regularnych”. Zatem podane polecenie działa dobrze, chociaż nie potrzebuje do działania funkcji rozszerzonych wyrażeń regularnych.
Craig McQueen