Comando CLI para atualizar arquivo XML simples

Comando CLI para atualizar arquivo XML simples

Gostaria de atualizar programaticamente uma string em um arquivo de configuração XML muito simples, como este:

<?xml version="1.0"?>
<x>
    <z>should be changed</z>
</x>
<y>
    <z>should NOT be changed</z>
</y>

Existe um comando CLI simples que atualizará x/z e NÃO y/z ? Talvez com um argumento seletor XPath, como:

$ xml-update myfile.xml /x/z "my new string"

Eu poderia escrever algo em Perl ou Python, mas dada a simplicidade deste problema, acho que deve haver um utilitário Unix inteligente que já faça isso.

Atualizar: Eu encontrei isso, mas parece um pouco exagerado. E eu teria que aprender XSLT primeiro.http://developerblog.redhat.com/2013/12/05/xml-editing-bash-script/

Responder1

Você pode usar oxml2/2xmlferramentas para processar XML na linha de comando sem muito barulho. xml2converte um documento XML em um formato orientado a linhas adequado para uso com ferramentas tradicionais de processamento de texto como awkou sed, e 2xmlpega esse formato e o converte de volta para XML.

Para seu exemplo, se eu pegar este documento:

<?xml version="1.0"?>
<doc>
<x>
    <z>should be changed</z>
</x>
<y>
    <z>should NOT be changed</z>
</y>
</doc>

Executar xml2esse conteúdo produz:

$ xml2 < doc.xml
/doc/x/z=should be changed
/doc/y/z=should NOT be changed

Posso modificar o conteúdo do <z>elemento assim

xml2 < doc.xml |
sed '/\/doc\/x\/z/ s/should be changed/look ma no hands/' |
2xml | tidyp -xml -i -q

Estou usando uma sedexpressão de pesquisa para procurar explicitamente a linha que começa com /doc/y/ze, em seguida, modificar o conteúdo dessa linha, o que nos dá:

<doc>
  <x>
    <z>look ma no hands</z>
  </x>
  <y>
    <z>should NOT be changed</z>
  </y>
</doc>

Passei a saída por tidypum formatador XML, pois caso contrário o documento ficaria assim:

<doc><x><z>look ma no hands</z></x><y><z>should NOT be changed</z></y></doc>

...que é sintaticamente correto, mas mais difícil de ler.

informação relacionada