Anexar texto às linhas entre dois padrões sempre que eles aparecerem em um arquivo

Anexar texto às linhas entre dois padrões sempre que eles aparecerem em um arquivo

Esta será uma tarefa bastante difícil, eu acho.

Eu tenho que mexer na documentação embutida que é extraída em arquivos html para ser usada como documentação online, mas essas partes dos arquivos devem estar sem
tags html no formato embutido, mas apenas nos arquivos html extraídos. No entanto, como essas partes da documentação também são extraídas para um arquivo .wiki, algumas tags já estão lá assim.

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>

Após a extração dessas partes da documentação que é feita facilmente via sed, quero enviar o arquivo extraído para isto:

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

O que consegui até agora é esta linha sed:

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

mas anexa as tags html também ao texto entre as á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/>

Isso é basicamente correto, porque sed é anexado a todas as linhas entre a primeira and the lasttag, mas não é o que eu pretendia.

Alguém pode me dar uma dica sobre o que estou perdendo aqui?

Responder1

Você tem barras invertidas incorretas. A expressão \<faznãocorresponde a um breakt esquerdo literal - um sem escape <corresponde perfeitamente a si mesmo, mas com a barra invertida, você o transforma em uma afirmação de largura zero no limite esquerdo do Word, o que nunca pode acontecer próximo a uma barra; então a expressão \</code>nunca pode corresponder a nada.

Com alguma refatoração menor para corrigir também outras hipercorreções meramente supérfluas, um sedscript fixo é

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

Tomei a liberdade de mudar as barras para outra coisa para eliminar ainda mais a necessidade de barras invertidas.

Demonstração:http://ideone.com/feVWgO

Responder2

OK, encontrei uma solução, embora não com sed, mas com 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
  '

Na verdade, isso é bastante simples, mas elegante.

informação relacionada