Agregar texto a las líneas entre dos patrones cada vez que aparecen en un archivo

Agregar texto a las líneas entre dos patrones cada vez que aparecen en un archivo

Supongo que será bastante difícil.

Tengo que juguetear con la documentación en línea que se extrae en archivos html para usarla como documentación en línea, pero estas partes de los archivos no deben tener
etiquetas html en el formulario en línea, sino solo en los archivos html extraídos. Sin embargo, dado que estas partes de la documentación también se extraen en un archivo .wiki, algunas etiquetas ya están ahí como esta.

this is some text describing what is done
<code>
here are 
some line that will be shown as code in wiki 
but not on html cause they are shown on one line
in html output
</code>

some more describing text
<code>
another piece of code 
that shows up as multiple lines in the wiki
but not in htmls
</code>

Después de extraer estas partes de la documentación, que se realiza fácilmente mediante sed, quiero enviar el archivo extraído a esto:

this is some text describing what is done
<code><br/>
here are <br/>
some line that will be shown as code in wiki <br/>
but not on html cause they are shown on one line<br/>
in html output<br/>
</code><br/>

some more describing text
<code><br/>
another piece of code <br/>
that shows up as multiple lines in the wiki<br/>
but not in htmls<br/>
</code><br/>

Lo que tengo hasta ahora es esta línea sed:

sed -i '/\<code>/,/\<\/code>/{s/$/\<br\/>/}' file

pero también agrega las etiquetas html al texto entre las áreas de código como esta:

this is some text describing what is done
<code><br/>
here are <br/>
some line that will be shown as code in wiki <br/>
but not on html cause they are shown on one line<br/>
in html output<br/>
</code><br/>
<br/>
some more describing text<br/>
<code><br/>
another piece of code <br/>
that shows up as multiple lines in the wiki<br/>
but not in htmls<br/>
</code><br/>

Esto es básicamente correcto, porque sed se agrega a todas las líneas entre la primera and the lastetiqueta, pero no es lo que pretendía.

¿Alguien puede darme una pista sobre lo que me falta aquí?

Respuesta1

Tiene barras invertidas incorrectas. La expresión \<hacenocoincidir con un breaket izquierdo literal: un sin escape <coincide muy bien, pero con la barra invertida, lo cambia a una aserción de ancho cero del límite izquierdo de la palabra, lo que nunca puede suceder junto a una barra diagonal; entonces la expresión \</code>nunca puede coincidir con nada.

Con algunas refactorizaciones menores para corregir también otras hipercorrecciones meramente superfluas, sedse obtiene un script fijo.

sed -i '/<code>/,\%</code>%s:$:<br/>:' file

Me tomé la libertad de cambiar las barras por otra cosa para eliminar aún más la necesidad de barras invertidas.

Manifestación:http://ideone.com/feVWgO

Respuesta2

Bien, encontré una solución, aunque no con sed, sino con awk.

awk '
  BEGIN{c=0} // initialize variable with zero
  /\<code>/{c=1} // if start pattern found set variable to 1
  {if (c==1) print $0,"<br/>"} // if variable is one, append tag
  {if (c==0) print $0} // if variable is zero just print line
  /\<\/code>/{c=0} //if endpattern is found set variable to zero
  '

En realidad, esto es bastante simple pero elegante.

información relacionada