Filtre la etiqueta html y reemplácela con otras etiquetas html usando sed

Filtre la etiqueta html y reemplácela con otras etiquetas html usando sed

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 Bque aparece dos veces en la cadena anterior. Debido a que coincide con la palabra By 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 Bdel corchete angular de cierre. Por lo tanto, <B>se reemplaza con <STRONG>pero Bse deja solo.

Captando las etiquetas de apertura y cierre

$ echo '<B> BBB B </B>' | sed -r 's|<(/)?B>|<\1STRONG>|g'
<STRONG> BBB B </STRONG>

-res para expresiones regulares extendidas, pero las versiones recientes de GNU sed también lo admiten -Ecomo sinónimo de -r. BSD sed se utiliza -Epara 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, sedintentará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:

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 gsubla 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

información relacionada