Estaba reemplazando <B> y </B> con <STRONG> y </STRONG> en un archivo. Es algo así como reemplazar etiquetas hmtl. Usé sed 's/<B>/STRONG/g' . Hizo el trabajo, pero si está en el archivo [B] y [/B] está presente. Luego también se transforman en [STRONG] y [/STRONG] . No entiendo la lógica detrás de esto.
Respuesta aceptada:
Por defecto, sed usa expresiones regulares básicas. Eso significa que GNU permite < hacer coincidir el principio de una palabra y > coincidir con el final de una palabra. Observa:
$ echo '<B> BBB B' | sed 's/<B>/STRONG/g'
<STRONG> BBB STRONG
<B> coincide con la palabra B que aparece dos veces en la cadena anterior. Porque coincide con la palabra B y no los corchetes angulares, los corchetes angulares se dejan sin cambios.
Si desea hacer coincidir los corchetes angulares, <> , deja la barra invertida desactivada:
$ echo '<B> BBB B' | sed 's/<B>/<STRONG>/g'
<STRONG> BBB B
<B> coincide con el paréntesis angular abierto seguido de B seguido del paréntesis angular de cierre. Por lo tanto, <B> se reemplaza con <STRONG> pero B se queda solo.
Capturar las etiquetas de apertura y cierre
$ echo '<B> BBB B </B>' | sed -r 's|<(/)?B>|<1STRONG>|g'
<STRONG> BBB B </STRONG>
-r es para expresiones regulares extendidas, pero las versiones recientes de GNU sed también son compatibles con -E como sinónimo de -r . BSD sed usa -E para esto y, según se informa, los futuros estándares POSIX han adoptado -E . Por lo tanto, por compatibilidad, uno puede querer usar (consejo de sombrero @Kos):
$ echo '<B> BBB B </B>' | sed -E 's|<(/)?B>|<1STRONG>|g'
<STRONG> BBB B </STRONG>