他のテキストとxmlタグの組み合わせ、grep in grepを含むファイルの内容をお探しですか?

他のテキストとxmlタグの組み合わせ、grep in grepを含むファイルの内容をお探しですか?

grep 'xmltag'と 'subtag'が一致するファイルがたくさんあります。

random xml
needed_text
random xml
<xmltag>
<subtag>content</subtag>
</xmltag>

他のテキスト「needed_text」と一致するファイルを検索したいと思います。

出力には少なくとも「content」を含める必要がありますが、完全な行も許可されます。

<xmltag>
     <subtag>content</subtag>
</xmltag>

xmltagとsubtagは同じ行にあっても別の行にあってもかまいません。

grep -rl "needed_text" * 

2番目の部分として入力する必要があるファイル名のリストを提供しますが、それを他のgrep(または他のコマンド)にどのように提供し、xmltagとsubtagの組み合わせのみを見つけるようにするにはどうすればよいですか?

ベストアンサー1

ファイルリストを別のコマンドに渡すには、を使用できますxargs。これを確実にするには、ほとんど-0の最新実装でサポートされているオプションが必要です。ファイルパスのリストはNULで区切る必要があります(-ZGNUgrepまたは互換オプションを使用)。

grep -rlZ "needed_text" . |
  xargs -r0 pcregrep -Mo '(?s)<xmltag>.*?</xmltag>'

<xmltag>(入れ子になったsがなく、<xmltag>sがCDATAに表示されないと仮定し、正規表現を使用してXMLを解析することに関する一般的な注意)。

ファイルが適切なXMLファイルである場合は、代わりに、xmllintなどのXML認識ツールを使用して必要なタグを抽出できます。xpathxmlstarletpcregrep

grep -rlZ "needed_text" . |
  xargs -r0 xpath -e //xmltag

xmltagまたは少なくとも1つのsについてのみsubtag

grep -rlZ "needed_text" . |
  xargs -r0 xpath -e //xmltag/subtag/..

xpath(ここで提供されているPerlモジュールを使用してくださいXML::XPath。)

おすすめ記事