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?

Nishant George Agrwal
quelle
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/.

Bruno Reis
quelle
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'
                                     ^
Alestanis
quelle
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