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?


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/


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'
                                     ^

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.