
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&Welcome</c>
</b>
<d>Hello & How are you?</d>
</a>
Estou usando o comando sed da seguinte maneira para alterar todas as ocorrências de & para &
sed -i 's:&:&:' 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, sed
precisa de um parâmetro para-i
sed -i.bak 's:&:&:' myfile.xml
e um arquivo de backup é uma boa ideia ou…
… usar Perl;)
Teste com
perl -pe 's/&/&/' myfile.xml
e faça umedição localcom
perl -pi -e 's/&/&/' 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&Welcome</c>
</b>
<d>Hello & 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\&|g' yourfile.xml
. Isso produzirá:
<!--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>
A segunda passagem será:
sed 's|Hello\ \&| \Hello\ \&|g' test.xml
. Produz:<!--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>
É claro que use
-i
switch para torná-lo permanente.
Outra forma avançada baseada no comentário do @terdon abaixo é:
sed -e 's/Hello &/Hello \&/' -e 's/Hi&/Hi\&/' filename.xml