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.