
Estaba reemplazando <B>
y </B>
con <STRONG>
y </STRONG>
en un archivo. Es algo así como reemplazar etiquetas hmtl. Solía 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.
Respuesta1
De forma predeterminada, sed utiliza expresiones regulares básicas. Eso significa que GNU permite \<
hacer coincidir el principio de una palabra y \>
el final de una palabra. Observar:
$ 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. Debido a que coincide con la palabra B
y no con los corchetes angulares, los corchetes angulares no se modifican.
Si desea hacer coincidir los corchetes angulares, <>
deje la barra invertida desactivada:
$ echo '<B> BBB B' | sed 's/<B>/<STRONG>/g'
<STRONG> BBB B
<B>
coincide con el corchete angular abierto seguido B
del corchete angular de cierre. Por lo tanto, <B>
se reemplaza con <STRONG>
pero B
se deja solo.
Captando 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 lo admiten -E
como sinónimo de -r
. BSD sed se utiliza -E
para esto y, según se informa, se han adoptado futuros estándares POSIX -E
. Por lo tanto, por compatibilidad, es posible que desee utilizar (consejo @Kos):
$ echo '<B> BBB B </B>' | sed -E 's|<(/)?B>|<\1STRONG>|g'
<STRONG> BBB B </STRONG>
Respuesta2
<
y >
no son caracteres especiales enExpresiones regulares básicas, por lo que no se deben escapar. Cuando hayas escapado de ellos, sed
intentarás tratarlos como personajes especiales, y luego el comportamiento seráindefinido:
La interpretación de un carácter ordinario precedido por ( '\' ) no está definida, excepto:
- Los caracteres ')', '(', '{' y '}'
- Los dígitos del 1 al 9 inclusive (verBRE que coinciden con varios caracteres)
- Un carácter dentro de una expresión entre corchetes
Entonces, solo usa <
y >
sin escapar:
$ echo 'b<b>' | sed 's/<b>/strong/'
bstrong
Respuesta3
Solución con awk
. Aquí tengo un archivo de muestra con dos líneas que contienenyetiquetas y utilice gsub
la función para reemplazarlas. Luego lo enviamos al archivo temporal y volvemos al archivo original. Elimine el archivo temporal cuando haya terminado. Adáptese según sea necesario.
$ cat tags.txt
<B> and </B>
<B> or </B>
$ awk '{gsub("<B>","<STRONG>"); gsub("</B>","</STRONG>");print}' tags.txt
<STRONG> and </STRONG>
<STRONG> or </STRONG>
$ awk '{gsub("<B>","<STRONG>"); gsub("</B>","</STRONG>");print}' tags.txt > tmpfile.txt && cat tmpfile > tags.txt