Nahrazoval jsem <B> a </B> s <STRONG> a </STRONG> v souboru. Je to něco jako nahrazení značek hmtl. Použil jsem sed 's/<B>/STRONG/g' . Provedlo to úlohu, ale pokud je v souboru [B] a [/B] je přítomen. Poté se také změní na [STRONG] a [/STRONG] . Nechápu za tím logiku.
Přijatá odpověď:
Ve výchozím nastavení používá sed základní regulární výrazy. To znamená, že GNU umožňuje < odpovídat začátku slova a > odpovídat na konec slova. Všimněte si:
$ echo '<B> BBB B' | sed 's/<B>/STRONG/g'
<STRONG> BBB STRONG
<B> odpovídá slovu B který se ve výše uvedeném řetězci objeví dvakrát. Protože se shoduje se slovem B a ne lomené závorky, lomené závorky jsou ponechány beze změny.
Pokud chcete použít lomené závorky, <> , ponechte zpětné lomítko vypnuté:
$ echo '<B> BBB B' | sed 's/<B>/<STRONG>/g'
<STRONG> BBB B
<B> odpovídá otevřené lomené závorce následované B následuje uzavírací úhelník. Tedy <B> je nahrazeno <STRONG> ale B je ponechán sám.
Zachycení otevřené i koncové značky
$ echo '<B> BBB B </B>' | sed -r 's|<(/)?B>|<1STRONG>|g'
<STRONG> BBB B </STRONG>
-r je pro rozšířený regulární výraz, ale nejnovější verze GNU sed také podporují -E jako synonymum pro -r . BSD sed používá -E pro toto a údajně i budoucí standardy POSIX přijaly -E . Z důvodu kompatibility může být vhodné použít (kloboukový tip @Kos):
$ echo '<B> BBB B </B>' | sed -E 's|<(/)?B>|<1STRONG>|g'
<STRONG> BBB B </STRONG>