¿Cómo reemplazar una línea en un archivo xml con un conjunto de líneas almacenadas en una variable o archivo usando comandos Unix?

¿Cómo reemplazar una línea en un archivo xml con un conjunto de líneas almacenadas en una variable o archivo usando comandos Unix?

tengo un archivo xml

en el cual la línea que se debe buscar es:

SEARCH='<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC>'

Este valor buscado debe reemplazarse con el valor de la siguiente variable o también puede almacenarse en otro archivo:

REPLACE='<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC><ErrorContext><CompatibilityMode>0</CompatibilityMode><ErrorOutput>1</ErrorOutput>.......some more tags.....</MethodContext>
'

¿Cómo se puede hacer esto usando comandos Unix como SED o AWK? (Aquí BUSCAR debe reemplazarse por REEMPLAZAR.

Respuesta1

Sí, se podría hacer con sed, pero estoy de acuerdo con Jens. Recomendaría utilizar una herramienta adecuada como la biblioteca python + lxml para buscar y reemplazar sus etiquetas.

Respuesta2

Por lo que puedo ver, los personajes a los que se les debe escapar:

awk '/<\?xml version="1.0" encoding="UTF-8" standalone="no"\?><SSC>/ {print "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><SSC><ErrorContext><CompatibilityMode>0</CompatibilityMode><ErrorOutput>1</ErrorOutput>.......some more tags.....</MethodContext>"}' <<< '<?xml version="1.0" encoding="UTF-8" standalone="no"?><SSC>'
  • en el campo BÚSQUEDA: ¿quieres escapar del? caracteres por \?
  • en el campo REEMPLAZAR: desea escapar los "caracteres por \"

O si necesita usar variables, también escape " en el campo BÚSQUEDA y escape los caracteres dos veces, una para almacenarlos en una variable y dos veces para repetirlos.

SEARCH_escaped=`sed -e 's/\?/\\\?/g' -e 's/\"/\\\"/g' <<< $SEARCH`
REPLACE_escaped=`sed 's/\"/\\\"/g' <<< $REPLACE`

awk "/$SEARCH_escaped/ {print \"$REPLACE_escaped\"}" <<< $SEARCH

información relacionada