Anexa texto a linhas entre dois padrões toda vez que eles aparecerem em um arquivo

0

Isso será bastante difícil, eu acho.

Eu tenho que mexer com a documentação embutida que é extraída em arquivos html para ser usada como documentação online, mas essas partes dos arquivos não devem ter tags html no formato inline, mas apenas nos arquivos html extraídos . No entanto, como essas partes da documentação também são extraídas em 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 é facilmente feita via sed, eu quero sed o arquivo extraído para isso:

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 eu tenho até agora é essa linha sed:

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

mas acrescenta 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 corrigível, porque o sed é anexado a todas as linhas entre a primeira tag and the last , mas não é o que eu pretendia.

Alguém pode me dar uma dica do que estou sentindo falta aqui?

    
por Oliver Friedrich 23.03.2015 / 15:42

2 respostas

1

Você tem barras invertidas incorretas. A expressão \< não não corresponde a uma posição à esquerda literal - uma < sem escape corresponde a si mesma, mas com a barra invertida, você a altera para uma asserção de largura zero de borda da palavra esquerda, que nunca pode acontecer ao lado de uma barra; então a expressão \</code> nunca pode corresponder a nada.

Com algumas pequenas refatorações para corrigir outras hipercorreções supostamente supérfluas, um script sed fixo é

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

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

Demo: link

    
por 26.03.2015 / 22:16
0

OK, encontrou 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
  '

Isso é bem simples, mas elegante.

    
por 24.03.2015 / 13:58