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>