以下は私のファイルの内容です。
<A>
<number>100</number>
<name>Word1</name>
</A>
<A>
<number>101</number>
<name> Word2</name>
</A>
grepを実行すると、次のWord1
出力を表示しようとします。
<A>
<number>100</number>
<name>Word1</name>
</A>
grepを実行すると、次のWord2
出力を表示しようとします。
<A>
<number>101</number>
<name>Word2</name>
</A>
誰でも助けることができますか?
答え1
これが正しい形式のXML文書の一部である場合は、XMLパーサーを使用して必要な部分を抽出できます。
満足するよく構造化必須です。<root>
XMLフラグメントをとでラップしました</root>
。
xmlstarlet sel -t -c '//A[name="Word1"]' -n file.xml
これを直接満たすことができない場合は、明示的にラップできます。
( echo '<root>'; cat file.xml; echo '</root>' ) | xmlstarlet sel -t -c '//A[name="Word1"]' -n
どちらの場合も、出力は次のようになります。
<A>
<number>100</number>
<name>Word1</name>
</A>
答え2
そしてpcregrep
:
<file.xml pcregrep -Mo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>'
GNUの使用grep
:
<file.xml grep -zPo '(?s)<A>(?:.(?!</A>))*Word1.*?</A>' | tr '\0' '\n'
(これはファイル全体がメモリにロードされ、NULバイトが含まれていないと仮定することを意味します)。
一部のPCRE演算子:
(?s)
オープンs
フラグ(.
偶数行区切り記号と一致).(?!</A>)
の先頭にないすべての文字</A>
。.*?
貪欲ではないバージョン.*
(:...)
グループ化するだけです。
<![CDATA[</A>]]>
Word2
あるいは、などのXMLパーサーが必要な式を見つけることができないか見つからないものに属します<![CDATA[W]]>ord2>
。Word2
ただし、XMLパーサーには有効なXML入力が必要ですが、ファイル全体を読み取る必要がある最上位要素に含めない限り、例ではそうではありません(ただし、これは一般的に使用するものです)、フォーマットは現在作業中であり、内容は変更される可能性があります高い(拡張<![CDATA
といくつかの&...;
シーケンス)。 Xpath式をWord1
使用すると、コメント、XMLタグ、属性など、どこでも見つけることが困難になります。