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.
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.
Você não precisa usar /
in sed, você pode usar vírgula por exemplo:
sed -i 's,<offset xmlns="">1</offset>,NEW_TEXT,' FILE
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</'
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 ;
}
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.
Tags sed