Warum ersetzt sed nicht alle Vorkommen?


118

Wenn ich diesen Code in bash ausführe:

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

es gibt Ausgabe:

log dog dos

Wie kann ich dafür sorgen, dass alle Vorkommen von Hunden ersetzt werden?


2
Sie benötigen das gFlag für die globale Substitution, auch hier benötigen Sie die -rOption nicht.
Chris Seymour

Antworten:


188

Sie sollten den gModifikator hinzufügen, damit sed den Inhalt des Musterpuffers global ersetzt:

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

Eine fantastische Dokumentation zu sed finden Sie unter http://www.grymoire.com/Unix/Sed.html . Diese globale Flagge wird hier erklärt: http://www.grymoire.com/Unix/Sed.html#uh-6

Die offizielle Dokumentation GNU sedzu finden Sie unter http://www.gnu.org/software/sed/manual/.


1
Hinzufügen eines Eckfalls für GNU sed hier: sed -E 's,foo,bar,g'macht nicht die globale Sache. Wenn Sie es ändern, sed -E -e 's,foo,bar,g'funktioniert es.
Melvyn Sopacua

23

Sie müssen ein gam Ende setzen, es steht für "global":

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

1
sed -e sollte anstelle von sed -r verwendet werden, das nicht existiert.
Dylan Daniels

1
@DylanDaniels Laut man sedUbuntu -rbedeutet die Option "erweiterte reguläre Ausdrücke verwenden". Der angegebene Befehl funktioniert also einwandfrei, obwohl er nicht die Funktionen erweiterter regulärer Ausdrücke benötigt, um zu funktionieren.
Craig McQueen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.