Como adicionar um atributo em uma tag no arquivo XML por linha de comando?

2

Estou tentando adicionar um campo ao final da tag usando o script sed. Suponha que eu tenha uma tag no arquivo XML:

<book name="Sed tutorial" price="250"/>

Agora quero adicionar o campo como Book_Width="A" após o final de <book/> tag para que minha tag se torne:

<book name="Sed tutorial" price="250" Book_Width="A"/>

Eu tentei com sed :

sed '/<book "[^>]*>/ a Book_Width="A"'

mas dá:

<book name="Sed tutorial" price="250"/>
Book_Width="A"
    
por krishna 12.08.2015 / 11:13

3 respostas

12

Você não deve analisar xml com sed , em vez disso, use um analisador xml como xmlstarlet . Para sua tarefa, seria:

xmlstarlet ed -O --inplace --insert "/book" --type attr -n Book_Width -v A xml_file

O conteúdo do arquivo é:

<book name="Sed tutorial" price="250" Book_Width="A"/>
  • O ed significa o modo de edição para editar a árvore xml
  • -O omite a tag xml
  • Queremos inserir algo com --insert
  • "/book" é o caminho onde inserir
  • --type attr : é um atributo, queremos inserir
  • O nome -n do atributo
  • O valor -v
por 12.08.2015 / 11:30
3

em sed "a" acrescenta um padrão EM UMA NOVA LINHA.

o que você quer fazer é substituir ( s ubstitute). Vamos usar dois pontos como separador para maior clareza:

sed 's:\(<book.*\)\(/>\): Book_Width="A":'

tudo em \( .. \) é um padrão memorizado pela ordem de aparição e recuperado por \indexnumber , por ex. reproduzirá o primeiro padrão salvo.

Portanto, estamos memorizando <book name="Sed tutorial" price="250" como padrão 1 e /> como padrão 2 e inserimos apenas Book_Width="A" no meio.

echo '<book name="Sed tutorial" price="250"/>' | sed 's:\(<book.*\)\(/>\): Book_Width="A":'
<book name="Sed tutorial" price="250" Book_Width="A"/>
    
por 12.08.2015 / 11:34
1

Com awk , você pode fazer algo assim:

Supondo que a linha esteja no arquivo file1.xml , então:

awk -F '/' '{print $1,"Book_Width=\"A\"",FS,$2}' file1.xml
    
por 12.08.2015 / 11:35