Grepping de contexto XML

Grepping de contexto XML

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 usar grep Word1, estou tentando ver a saída abaixo,

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

se eu usar grep Word2, estou tentando ver a saída abaixo,

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

Alguém poderia ajudar com isso, por favor?

Responder1

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

Para satisfazer obem formadorequisito, envolvi seu fragmento XML com <root>e </root>.

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

Se você não puder satisfazer isso diretamente, poderá envolvê-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>

Responder2

Com pcregrep:

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

Com GNU grep:

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

(embora isso signifique que todo o arquivo seja carregado na memória e presuma que não contém bytes NUL).

Alguns operadores PCRE:

  • (?s)ativa a sbandeira ( .corresponde aos delimitadores de linha pares)
  • .(?!</A>)qualquer caractere, desde que não esteja no início de </A>.
  • .*?versão não gananciosa de.*
  • (:...)apenas agrupando.

Ele é enganado por coisas como <![CDATA[</A>]]>ou não encontraria um Word2expresso como <![CDATA[W]]>ord2>ou &#87;ord2para o qual você precisaria de um analisador XML. Mas então um analisador XML precisaria de uma entrada XML válida, o que sua amostra não é, a menos que você o inclua em um elemento de nível superior, precisaria ler o arquivo completo (mas, novamente, esse geralmente é o seu destino ao trabalhar com esse formato) e seria potencialmente transformar o conteúdo (expandir o <![CDATAe algumas &...;sequências). E uma expressão xpath tornaria difícil encontrá-las Word1em qualquer lugar, inclusive em comentários ou tags ou atributos XML.

informação relacionada