Stavo sostituendo <B>
e </B>
con <STRONG>
e </STRONG>
in un file. È un po' come sostituire i tag hmtl. Ho usato sed 's/<B>/STRONG/g'
. Ha fatto il lavoro ma se nel file [B]
e [/B]
è presente. Quindi anche loro vengono cambiati in [STRONG]
e [/STRONG]
. Non capisco la logica dietro.
Risposta accettata:
Per impostazione predefinita, sed utilizza espressioni regolari di base. Ciò significa che GNU consente <
trova l'inizio di una parola e >
corrisponde alla fine di una parola. Osserva:
$ echo '<B> BBB B' | sed 's/<B>/STRONG/g'
<STRONG> BBB STRONG
<B>
corrisponde alla parola B
che appare due volte nella stringa sopra. Perché corrisponde alla parola B
e non le parentesi angolari, le parentesi angolari rimangono invariate.
Se vuoi far corrispondere le parentesi angolari, <>
, lascia la barra rovesciata disattivata:
$ echo '<B> BBB B' | sed 's/<B>/<STRONG>/g'
<STRONG> BBB B
<B>
corrisponde a parentesi angolari aperte seguite da B
seguito da parentesi angolare di chiusura. Pertanto, <B>
viene sostituito con <STRONG>
ma B
è lasciato solo.
Cattura sia i tag di apertura che di chiusura
$ echo '<B> BBB B </B>' | sed -r 's|<(/)?B>|<1STRONG>|g'
<STRONG> BBB B </STRONG>
-r
è per espressioni regolari estese ma le versioni recenti di GNU sed supportano anche -E
come sinonimo di -r
. BSD sed usa -E
per questo e, secondo quanto riferito, i futuri standard POSIX hanno adottato -E
. Pertanto, per compatibilità, si potrebbe voler utilizzare (consiglio di cappello @Kos):
$ echo '<B> BBB B </B>' | sed -E 's|<(/)?B>|<1STRONG>|g'
<STRONG> BBB B </STRONG>