
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&Welcome</c>
</b>
<d>Hello & How are you?</d>
</a>
Estoy usando el comando sed de la siguiente manera para cambiar todas las apariciones de & en &
sed -i 's:&:&:' myfile.xml
pero recibo el error "etiqueta indefinida 'yfile.xml'. No puedo continuar. ¿Como hacer esto?
Respuesta1
Si no tienessed GNU, sed
necesita un parámetro para-i
sed -i.bak 's:&:&:' myfile.xml
y un archivo de respaldo es una buena idea o...
… usa Perl;)
Prueba con
perl -pe 's/&/&/' myfile.xml
y hacer unedición in situcon
perl -pi -e 's/&/&/' myfile.xml
Pero sólo una vez.
Después del comando, el contenido de myfile.xml
es
<!--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>
Respuesta2
Necesitas escapar y por tu carácter especial. Y necesitas dos pases para completarlo.
Usa
1. sed 's|Hi\&|Hi\&|g' yourfile.xml
. Esto producirá:
<!--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>
El segundo pase será:
sed 's|Hello\ \&| \Hello\ \&|g' test.xml
. Produce:<!--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>
Por supuesto, use
-i
el interruptor para hacerlo permanente.
Otra forma avanzada basada en el comentario de @terdon a continuación es:
sed -e 's/Hello &/Hello \&/' -e 's/Hi&/Hi\&/' filename.xml