Como alterar valores no arquivo XML

1

Eu tenho um arquivo XML como abaixo. Eu quero mudar os valores em is-required lugar e default-value lugar de cada nome de argumento usando um script de shell ..

  • em que argument name=protocol , em seguida, is-required = "true" e default-value=tcp ,
  • em que argument name =port , em seguida, is-required = "true" default-value= 7223 ,
  • em que argument name = e is-required = "true" default-value=test ,

Exemplo:

<task-arguments>
    <argument name="protocol" is-required="false" default-value="ssl"/>
    <argument name="port" is-required="true" default-value="7222"/>
    <argument name="username" is-required="true" default-value="admin"/>
</task-arguments>
    
por Sureshchandra Jarugula 11.07.2016 / 10:03

2 respostas

1

Em geral, o processamento XML deve ser feito com um analisador XML .

ATUALIZAÇÃO: Na verdade, eu acho infeliz que esta resposta tenha sido escolhida como a "resposta aceita" porque a resposta do @SatoKatsura está correta e melhor. Ele usa um analisador XML adequado e é mais curto. Veja também os comentários do @cas à minha resposta. A análise XML realmente deve não ser tentada com ferramentas orientadas a linha.

No entanto, tratando você documento como texto simples:

#!/usr/bin/sed -f

/argument name="protocol"/{
    i\
<argument name="protocol" is-required="true" default-value="tcp"/>
    d
}

/argument name="port"/{
    i\
<argument name="port" is-required="true" default-value="7223"/>
    d
}

/argument name="username"/{
    i\
<argument name="username" is-required="true" default-value="test"/>
    d
}

Este script sed encontrará as linhas que você deseja modificar e substituirá a linha inteira por uma linha contendo o XML que você deseja.

Eu estou escolhendo fazer isso de uma maneira bem pesada, porque isso lhe dá uma maneira fácil de mudar os valores para o que você quiser, e não depende de muita magia em expressões regulares.

EDITAR:

O script iria para um arquivo próprio, talvez script.sed . Você então executaria com

$ sed -f script.sed data.xml >data.new

Isso aplicará o script ao arquivo data.xml e gerará o resultado no arquivo data.new .

O seguinte é um script que permite definir os valores do protocolo, porta e usuário, bem como quais arquivos de dados devem ser lidos e gravados:

#!/bin/sh

xmlfile_in="data.xml"
xmlfile_out="data.new"

protocol="tcp"
port="7223"
user="test"

sed -f /dev/stdin "$xmlfile_in" >"$xmlfile_out" <<END_SED
/argument name="protocol"/{
    i\
<argument name="protocol" is-required="true" default-value="$protocol"/>
    d
}

/argument name="port"/{
    i\
<argument name="port" is-required="true" default-value="$port"/>
    d
}

/argument name="username"/{
    i\
<argument name="username" is-required="true" default-value="$user"/>
    d
}
END_SED
    
por 11.07.2016 / 11:00
5

Usando o XMLStarlet :

xml ed -P \
    -u '//argument[@name="protocol"]/@is-required' -v true \
    -u '//argument[@name="protocol"]/@default-value' -v tcp \
    -u '//argument[@name="port"]/@is-required' -v true \
    -u '//argument[@name="port"]/@default-value' -v 7223 \
    -u '//argument[@name="username"]/@is-required' -v true \
    -u '//argument[@name="username"]/@default-value' -v admin \
        file.xml

Resultado para sua amostra:

<task-arguments>
    <argument name="protocol" is-required="true" default-value="tcp"/>
    <argument name="port" is-required="true" default-value="7223"/>
    <argument name="username" is-required="true" default-value="admin"/>
</task-arguments>
    
por 11.07.2016 / 13:06

Tags