Usando sed com caracteres especiais

2

Eu tenho um diretório cheio de arquivos XML que se parecem com isso, para o qual eu quero mudar o valor do número do elemento "offset" de 1 para algum outro número

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

Eu escrevi várias combinações deste comando sed, mas nada que eu tentei é executado sem um erro. Tenho certeza que preciso escapar de alguns dos personagens, mas aqueles que eu tentei sempre terminam em erros ("token inesperado", "opção desconhecida", etc). Eu também tentei sem o sinalizador -e, já que realmente não é uma expressão.

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

Qualquer ajuda seria apreciada.

    
por EdgeCase 18.06.2014 / 14:47

5 respostas

4

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.

    
por 18.06.2014 / 14:59
6

Você não precisa usar / in sed, você pode usar vírgula por exemplo:

sed -i 's,<offset xmlns="">1</offset>,NEW_TEXT,' FILE
    
por 18.06.2014 / 15:00
2

Você geralmente não precisa de tudo isso na função s/earch/replace/ e pode, em vez disso, /address/ e condicionalmente /s/// . Ele pode não apenas ajudar com a leitura e evitar alguns dos problemas que você mencionou, mas também pode haver um aumento de desempenho:

sed '/offset xmlns=/s/>1</>99</'
    
por 18.06.2014 / 15:18
1

Use um analisador adequado para arquivos XML. Por exemplo, eu usaria xsh e usaria o seguinte script:

for my $file in { @ARGV } {
    open $file ;
    for //offset set . 1 ;
    save :b ;
}
    
por 18.06.2014 / 15:01
0

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

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

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

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

para mudar para 8.

    
por 18.06.2014 / 15:05

Tags