Buscar y reemplazar un carácter en un archivo xml usando el comando sed no funciona

Buscar y reemplazar un carácter en un archivo xml usando el comando sed no funciona

Tengo un archivo xml llamado 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>

quiero esta transformacion

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

Estoy usando el comando sed de la siguiente manera para cambiar todas las apariciones de & en &

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

pero recibo el error "etiqueta indefinida 'yfile.xml'. No puedo continuar. ¿Como hacer esto?

Respuesta1

Si no tienessed GNU, sednecesita un parámetro para-i

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

y un archivo de respaldo es una buena idea o...

… usa Perl;)

Prueba con

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

y hacer unedición in situcon

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

Pero sólo una vez.

Después del comando, el contenido de myfile.xmles

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

Respuesta2

Necesitas escapar y por tu carácter especial. Y necesitas dos pases para completarlo.

Usa
1. sed 's|Hi\&|Hi\&amp;|g' yourfile.xml. Esto producirá:

<!--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. El segundo pase será: sed 's|Hello\ \&| \Hello\ \&amp;|g' test.xml. Produce:

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

    Por supuesto, use -iel interruptor para hacerlo permanente.

Otra forma avanzada basada en el comentario de @terdon a continuación es:

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

información relacionada