
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 dass
Flag 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, Word2
ausgedrückt als <![CDATA[W]]>ord2>
oder Word2
wofü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 ( <![CDATA
und einige &...;
Sequenzen erweitern). Und ein XPath-Ausdruck würde es schwierig machen, diese irgendwo zu finden, Word1
einschließlich in Kommentaren oder XML-Tags oder -Attributen.