XML-Kontext-Grepping

XML-Kontext-Grepping

Unten ist der Inhalt meiner Datei,

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

Wenn ich nach greppe Word1, versuche ich, die folgende Ausgabe anzuzeigen:

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

Wenn ich nach greppe Word2, versuche ich, die folgende Ausgabe anzuzeigen:

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

Kann mir bitte jemand dabei helfen?

Antwort1

Wenn dies Teil eines wohlgeformten XML-Dokuments ist, können Sie den erforderlichen Teil mit einem XML-Parser extrahieren.

Um diegut geformtAnforderung, ich habe Ihr XML-Fragment mit <root>und umschlossen </root>.

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

Wenn Sie dies nicht direkt erfüllen können, können Sie es explizit einschließen

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

In beiden Fällen ist die Ausgabe folgende:

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

Antwort2

Mit pcregrep:

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

Mit GNU grep:

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

(das bedeutet allerdings, dass die gesamte Datei in den Speicher geladen wird und davon ausgegangen wird, dass sie keine NUL-Bytes enthält).

Einige PCRE-Operatoren:

  • (?s)schaltet das sFlag ein ( .entspricht geraden Zeilentrennzeichen)
  • .(?!</A>)jedes beliebige Zeichen, sofern es nicht am Anfang von steht </A>.
  • .*?nicht-gierige Version von.*
  • (:...)nur gruppieren.

Es wird durch Dinge wie <![CDATA[</A>]]>oder nicht gefunden, Word2ausgedrückt als <![CDATA[W]]>ord2>oder &#87;ord2wofür Sie einen XML-Parser benötigen würden. Ein XML-Parser würde jedoch gültige XML-Eingaben benötigen, was Ihr Beispiel nicht ist, es sei denn, Sie schließen es in ein Element der obersten Ebene ein, müsste die Datei vollständig lesen (aber das ist im Allgemeinen Ihr Los, wenn Sie mit diesem Format arbeiten) und würde möglicherweise den Inhalt umwandeln ( <![CDATAund einige &...;Sequenzen erweitern). Und ein XPath-Ausdruck würde es schwierig machen, diese irgendwo zu finden, Word1einschließlich in Kommentaren oder XML-Tags oder -Attributen.

verwandte Informationen