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>