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>