Ich habe <B>
ersetzt und </B>
mit <STRONG>
und </STRONG>
in einer Datei. Es ist so etwas wie das Ersetzen von hmtl-Tags. Ich habe sed 's/<B>/STRONG/g'
verwendet . Es hat den Job gemacht, aber wenn in der Datei [B]
und [/B]
ist anwesend. Dann werden sie auch in [STRONG]
geändert und [/STRONG]
. Ich verstehe die Logik dahinter nicht.
Akzeptierte Antwort:
Standardmäßig verwendet sed grundlegende reguläre Ausdrücke. Das bedeutet, dass GNU <
zulässt Übereinstimmung mit dem Anfang eines Wortes und >
dem Ende eines Wortes entsprechen. Beachten Sie:
$ echo '<B> BBB B' | sed 's/<B>/STRONG/g'
<STRONG> BBB STRONG
<B>
entspricht dem Wort B
die in der obigen Zeichenfolge zweimal vorkommt. Weil es mit dem Wort B
übereinstimmt und nicht die spitzen Klammern, die spitzen Klammern bleiben unverändert.
Wenn Sie spitze Klammern abgleichen möchten, <>
, lassen Sie den Backslash weg:
$ echo '<B> BBB B' | sed 's/<B>/<STRONG>/g'
<STRONG> BBB B
<B>
entspricht einer offenen spitzen Klammer, gefolgt von B
gefolgt von einer schließenden spitzen Klammer. Also <B>
wird durch <STRONG>
ersetzt aber B
allein gelassen wird.
Erfassen sowohl des öffnenden als auch des schließenden Tags
$ echo '<B> BBB B </B>' | sed -r 's|<(/)?B>|<1STRONG>|g'
<STRONG> BBB B </STRONG>
-r
ist für erweiterte Regex, aber neuere Versionen von GNU sed unterstützen auch -E
als Synonym für -r
. BSD sed verwendet -E
dafür und angeblich haben zukünftige POSIX-Standards -E
übernommen . Aus Kompatibilitätsgründen sollte man also verwenden (Huttipp @Kos):
$ echo '<B> BBB B </B>' | sed -E 's|<(/)?B>|<1STRONG>|g'
<STRONG> BBB B </STRONG>