Das "|" braucht auch einen Backslash, um seine besondere Bedeutung zu bekommen.
echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'
werde tun was du willst.
Wie Sie wissen, lesen Sie das Handbuch, wenn alles andere fehlschlägt :-).
GNU sed Benutzerhandbuch , Abschnitt 3.3 Übersicht über die Syntax regulärer Ausdrücke :
`REGEXP1 \ | REGEXP2 '
Entspricht entweder REGEXP1 oder REGEXP2.
Beachten Sie den Backslash ...
Leider ist die Regex-Syntax nicht wirklich standardisiert ... es gibt viele Varianten, die sich unter anderem darin unterscheiden, welche "Sonderzeichen" \ benötigen und welche nicht. In einigen Fällen ist es sogar konfigurierbar oder hängt von Schaltern ab (wie in GNU grep
, wo Sie zwischen drei verschiedenen Regex-Dialekten wechseln können).
Diese Antwort ist insbesondere für GNU sed . Es gibt andere sed
Varianten, zum Beispiel die in den BSDs verwendeten, die sich unterschiedlich verhalten.
sed
unterstützt die Abwechslung, jedoch nur mit "erweiterter" Regex-Syntax (-E
) - was bedeutet, dass weder die Pipes noch die Klammernecho "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
Da es einige Kommentare zu Nicht-Gnu-
sed
Implementierungen gibt: Zumindest unter OS X können Sie das-E
Argument verwenden, umsed
:Dann können Sie Metazeichen mit regulären Ausdrücken verwenden, ohne sie zu maskieren. Beispiel:
quelle
GNU sed unterstützt auch die
-r
Option (erweiterte reguläre Ausdrücke). Dies bedeutet, dass Sie den Metazeichen nicht entkommen müssen:Ausgabe:
quelle
-r
Option ist wirklich sehr hilfreich für die Lesbarkeit der Ausdrücke. Das sollte die akzeptierte Antwort sein.Das
\|
funktioniert auch nicht mit sed unter Solaris 10. Was ich tat, war Gebrauchquelle
Followup: sed -E erlaubt es unter MacOS. Kein Backslash nötig für |.
quelle
In der GnuWin32 unter Windows sed ist die Syntax
sed "s/thing1\|thing2/ /g" source > destination
.Die Anführungszeichen müssen vom Typ
"
"Erforderlich" sein, damit der Befehl analysiert werden kann.quelle