Insere uma string multilinha em outra string

4

Eu preciso inserir linhas em um arquivo xml:

Inserir

  <one>
  </one>

em

<tags>
</tags>

Para obter

<tags>
  <one>
  </one>
</tags>

Eu tentei isso:

sed "s#\(< /tags>\)#${multiline_string}#"

mas perde o recuo.

    
por Philippe Blayo 24.02.2012 / 16:51

2 respostas

3

Como disse o Mat, o recuo (e o espaço em branco em geral) não é importante em arquivos XML. Isso:

<one><tags></tags></one>

é exatamente equivalente a:

<one>
 <tags>
 </tags>
</one>

Mas isso funcionará preservando o recuo:

$ cat myfile.xml
<tags>
</tags>
$ sed '/<one>/ a\
  <tags>\
  </tags>
' myfile.xml > newfile.xml
$ cat newfile.xml
<one>
  <tags>
  </tags>
</one>

... mas se você estiver trabalhando com XML, talvez queira pensar em usar uma linguagem de nível mais alto que possa realmente analisar XML e manipular a árvore de forma programática.

    
por 24.02.2012 / 17:01
0

O seguinte é um mod para o código que você mostra na pergunta.

Note que $'\n' é uma maneira de ksh (também suportado por bash e zsh ) para criar um caractere de nova linha, então ajuste como necessário se você estiver usando outro shell.

sed "s|\(</tags>\)|${multiline_string//$'\n'/\n}|g"

O trailing g serve para situações em que você pode ter </tags> ocorrendo mais de uma vez em uma linha. Parece que não é necessário para seu xml , mas funciona de qualquer maneira.

    
por 25.02.2012 / 01:52

Tags