Encontrar e substituir um caractere no arquivo xml usando o comando sed não está funcionando

Encontrar e substituir um caractere no arquivo xml usando o comando sed não está funcionando

Eu tenho um arquivo xml chamado myfile.xml

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&Welcome</c>
   </b>
   <d>Hello & How are you?</d>
</a>

Eu quero essa transformação

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&amp;Welcome</c>
   </b>
   <d>Hello &amp; How are you?</d>
</a>

Estou usando o comando sed da seguinte maneira para alterar todas as ocorrências de & para &

sed -i 's:&:&amp;:' myfile.xml

mas estou recebendo o erro `rótulo indefinido 'yfile.xml'. Não consigo prosseguir. Como fazer isso?

Responder1

Se você não temGNU sed, sedprecisa de um parâmetro para-i

sed -i.bak 's:&:&amp;:' myfile.xml

e um arquivo de backup é uma boa ideia ou…

… usar Perl;)

Teste com

perl -pe 's/&/&amp;/' myfile.xml

e faça umedição localcom

perl -pi -e 's/&/&amp;/' myfile.xml

Mas apenas uma vez.

Após o comando, o conteúdo de myfile.xmlé

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&amp;Welcome</c>
   </b>
   <d>Hello &amp; How are you?</d>
</a>

Responder2

Você precisa escapar e por causa do personagem especial. E você precisa de duas passagens para concluí-lo.

Use
um. sed 's|Hi\&|Hi\&amp;|g' yourfile.xml. Isso produzirá:

<!--This is an xml document for test-->
<a><!--This is root node-->
   <b>
     <c>Hi&amp;Welcome</c>
   </b>
   <d>Hello & How are you?</d>
</a>
  1. A segunda passagem será: sed 's|Hello\ \&| \Hello\ \&amp;|g' test.xml. Produz:

    <!--This is an xml document for test-->
    <a><!--This is root node-->
       <b>
        <c>Hi&amp;Welcome</c>
       </b>
       <d> Hello &amp; How are you?</d>
    </a>
    

    É claro que use -iswitch para torná-lo permanente.

Outra forma avançada baseada no comentário do @terdon abaixo é:

sed -e 's/Hello &/Hello \&amp;/' -e 's/Hi&/Hi\&amp;/' filename.xml

informação relacionada