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>