Grepping de contexto XML

Grepping de contexto XML

A continuación se muestra el contenido de mi archivo,

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

Si busco Word1, estoy tratando de ver el resultado como se muestra a continuación,

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

Si busco Word2, estoy tratando de ver el resultado como se muestra a continuación,

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

¿Alguien podría ayudar con esto, por favor?

Respuesta1

Si esto es parte de un documento XML bien formado, puede extraer la parte requerida con un analizador XML.

Para satisfacer elbien formadorequisito, he envuelto su fragmento XML con <root>y </root>.

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

Si no puede satisfacer esto directamente, puede envolverlo explícitamente

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

En cualquier caso, el resultado es este:

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

Respuesta2

Con pcregrep:

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

Con GNU grep:

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

(aunque eso significa que todo el archivo está cargado en la memoria y se supone que no contiene bytes NUL).

Algunos operadores PCRE:

  • (?s)enciende la sbandera ( .coincide con delimitadores de líneas pares)
  • .(?!</A>)cualquier carácter siempre que no esté al comienzo de </A>.
  • .*?versión no codiciosa de.*
  • (:...)simplemente agrupando.

Se deja engañar por cosas como <![CDATA[</A>]]>o no encontraría un Word2expresado como <![CDATA[W]]>ord2>o &#87;ord2para el cual necesitaría un analizador XML. Pero entonces un analizador XML necesitaría una entrada XML válida, que su muestra no es a menos que la incluya en un elemento de nivel superior, necesitaría leer el archivo en su totalidad (pero, de nuevo, eso generalmente le corresponde cuando trabaja con ese formato) y transformar potencialmente el contenido (ampliar las <![CDATAy algunas &...;secuencias). Y una expresión xpath haría difícil encontrarlas Word1en cualquier lugar, incluidos comentarios o etiquetas o atributos XML.

información relacionada