contexto do XML grepping

2

Abaixo está o conteúdo do meu arquivo,

<A>
<number>100</number>
<name>Word1</name>
</A>
<A>
<number>101</number>
<name> Word2</name>
</A>

se eu pedir Word1 , estou tentando ver a saída como abaixo,

<A>
<number>100</number>
<name>Word1</name>
</A>

se eu pedir Word2 , estou tentando ver a saída como abaixo,

<A>
<number>101</number>
<name>Word2</name>
</A>

Alguém poderia ajudar com isso, por favor?

    
por user261600 21.11.2017 / 12:46

2 respostas

9

Se isso fizer parte de um documento XML bem formado, você poderá extrair a peça necessária com um analisador XML.

Para satisfazer o requisito bem formado , agrupamos seu fragmento XML com <root> e </root> .

xmlstarlet sel -t -c '//A[name="Word1"]' -n file.xml

Se você não puder satisfazê-lo diretamente, poderá enviá-lo explicitamente

( echo '<root>'; cat file.xml; echo '</root>' ) | xmlstarlet sel -t -c '//A[name="Word1"]' -n

Em ambos os casos, a saída é esta:

<A>
<number>100</number>
<name>Word1</name>
</A>
    
por 21.11.2017 / 13:07
1

com pcregrep :

<file.xml pcregrep -Mo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>'

Com o GNU grep :

<file.xml grep -zPo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>' | tr '
<file.xml pcregrep -Mo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>'
' '\n'

(embora isso signifique que o arquivo inteiro está carregado na memória e assume que ele não contém bytes NUL).

Alguns operadores de PCRE:

  • (?s) ativa o sinal s ( . corresponde a delimitadores de linha pares)
  • .(?!</A>) qualquer caractere desde que não esteja no início de </A> .
  • .*? versão não-voraz de .*
  • (:...) apenas agrupamento.

Ele é enganado por coisas como <![CDATA[</A>]]> ou não acharia um Word2 expresso como <![CDATA[W]]>ord2> ou &#87;ord2 para o qual você precisaria de um analisador XML. Mas, então, um analisador XML precisaria de uma entrada XML válida, a qual sua amostra não é, a menos que você a inclua em um elemento de nível superior, precisaria ler o arquivo inteiro (mas, geralmente, é muito comum trabalhar com esse formato) potencialmente transformar o conteúdo (expanda as seqüências <![CDATA e algumas &...; ). E uma expressão xpath dificultaria encontrar esses Word1 em qualquer lugar, incluindo comentários ou tags XML ou atributos.

    
por 21.11.2017 / 17:55

Tags