Usando sed con caracteres especiales

Usando sed con caracteres especiales

Tengo un directorio lleno de archivos XML que se ven así, para los cuales quiero cambiar el valor del número del elemento "desplazamiento" de 1 a algún otro número.

$ cat my.xml
      <offset xmlns="">1</offset>

Escribí varias combinaciones de este comando sed, pero nada de lo que probé se ejecuta sin errores. Estoy bastante seguro de que necesito escapar de algunos de los caracteres, pero los que he probado siempre terminan en errores ("token inesperado", "opción desconocida", etc.). También lo intenté sin el indicador -e, ya que en realidad no es una expresión.

sed -i -e s/<offset xmlns="">1</offset>/<offset xmlns="">99</offset>/ *.xml

Cualquier ayuda sería apreciada.

Respuesta1

No es necesario usarlo /en sed, puede usar una coma, por ejemplo:

sed -i 's,<offset xmlns="">1</offset>,NEW_TEXT,' FILE

Respuesta2

Prueba esto,

$ sed 's~<offset xmlns="">1~<offset xmlns="">99~g' file
          <offset xmlns="">99</offset>

Utilice un delimitador sed diferente si la entrada contiene barras.

Respuesta3

Por lo general, no necesita todo eso en la s/earch/replace/función en sí, sino que puede hacerlo primero /address/y luego de forma condicional /s///. No solo puede ayudar con la legibilidad y evitar algunos de los problemas que menciona, sino que también puede aumentar el rendimiento:

sed '/offset xmlns=/s/>1</>99</'

Respuesta4

Reemplazaría el carácter 17 de la línea, que contiene el valor:

sed -i 's/^\(.\{17\}\)./\1VALUE/' file.xml

Reemplace VALOR con el nuevo valor de <offset>. P.ej.

sed -i 's/^\(.\{17\}\)./\18/' file.xml

para cambiarlo a 8.

información relacionada