Usando sed com caracteres especiais

Usando sed com caracteres especiais

Eu tenho um diretório cheio de arquivos XML parecidos com este, para os quais desejo alterar o valor do número do elemento "offset" de 1 para algum outro número

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

Escrevi várias combinações desse comando sed, mas nada do que tentei foi executado sem erros. Tenho certeza de que preciso escapar de alguns caracteres, mas aqueles que tentei sempre terminam em erros ("token inesperado", "opção desconhecida", etc). Também tentei sem o sinalizador -e, pois realmente não é uma expressão.

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

Qualquer ajuda seria apreciada.

Responder1

Não precisa usar /no sed, pode usar vírgula por exemplo:

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

Responder2

Tente isso,

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

Use um delimitador sed diferente se a entrada contiver barras.

Responder3

Geralmente, você não precisa de tudo isso na s/earch/replace/função em si e, em vez disso, pode primeiro /address/e depois condicionalmente /s///. Isso não só pode ajudar na legibilidade e evitar alguns dos problemas mencionados, mas também pode haver um aumento de desempenho:

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

Responder4

Eu substituiria o 17º caractere da linha, que contém o valor:

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

Substitua VALUE pelo novo valor de <offset>. Por exemplo.

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

para alterá-lo para 8.

informação relacionada