Reemplazar contenido dynamic en archivo XML

Resumen rápido: necesito crear un script Bash para cambiar el texto dentro de un nodo automáticamente cada semana. La secuencia de comandos coincidirá con el nodo y reemplazará el texto dentro de ellos (si esto es posible)? ¿Cómo haría esto?

Resumen largo: tengo un servidor de Minecraft que tiene tiendas, cada una de las cuales tiene su propio archivo .xml en el directorio / ShowcaseStandalone / ffs-storage /. Todos los domingos mi servidor se reinicia y ejecuta varios comandos en la terminal para reiniciar varias cosas. Una de las cosas que bash hacer es una de las tiendas. Quiero cambiar el texto en el nodo y el texto en el nodo . Simplemente quiero tomar el texto de un archivo .txt en una carpeta diferente e insertarlo en ese nodo. El problema es que el texto en el nodo cambiará todas las semanas. ¿Hay alguna manera de reemplazar una línea o texto específico dentro de dos nodos usando bash?

Archivo XML:

   Chadward27 Frisnuk 329:0 BUY 55.0 487.5 179.0 -1084.5 0 0 true   

Sistema operativo: Linux Ubuntu 12.04

Puede usar xmlstarlet para editar un archivo XML en un shell como este:

 xmlstarlet edit -L -u "/scs-shop/price[@type='double']" -v '99.66' file.xml 

NOTA

  • "/scs-shop/price[@type='double']" es una expresión de Xpath
  • ver xmlstarlet ed --help

La forma XML es genial, pero si necesita usar herramientas bash normales, puede modificar una línea usando sed. Por ejemplo:

 PRICE=123 sed -i "s/\(\)[^<>]*\(<\/price.*\)/\1$PRICE\2/" $XML_FILE_TO_MODIFY 

Esto reemplazará el precio con 123.

Ese comando sed parece desalentador, así que déjame desglosarlo:

\(\)[^<>]*\(<\/price.*\) es el patrón que coincide. \( ... \) son paréntesis para agrupar. coincide con la etiqueta de precio de apertura. [^<>]* coincide con cualquier cosa excepto los corchetes angulares, y en este caso coincidirá con el contenido de la etiqueta de precio. <\/price.* coincide con el final de la etiqueta de precio. La barra diagonal es un delimitador en sed, así que escapo con una barra invertida.

\1$PRICE\2 es el texto para reemplazar el texto coincidente. \1 refiere al primer grupo de paréntesis apareado, que es la etiqueta de precio de apertura. $PRICE es la variable con el precio deseado. \2 refiere al segundo grupo de paréntesis, en este caso, la etiqueta de cierre.

No tuve el lujo de tener xmlstarlet. Encontré una solución, simplemente haciendo un reemplazo en línea;

template-parameter.xml

  ##-ParamName-##  ##-ParamValue-##   

Retazo

 tokenName="foo" tokenValue="bar" #Replace placeholders in parameter template element myParamElement=$(cat template-parameter.xml) myParamElement=${myParamElement//##-ParamName-##/$tokenName} myParamElement=${myParamElement//##-ParamValue-##/$tokenValue} 

Resultado

  foo  bar