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で区切る必要があります(-Z
GNUgrep
または互換オプションを使用)。
grep -rlZ "needed_text" . |
xargs -r0 pcregrep -Mo '(?s)<xmltag>.*?</xmltag>'
<xmltag>
(入れ子になったsがなく、<xmltag>
sがCDATAに表示されないと仮定し、正規表現を使用してXMLを解析することに関する一般的な注意)。
ファイルが適切なXMLファイルである場合は、代わりに、xmllint
などのXML認識ツールを使用して必要なタグを抽出できます。xpath
xmlstarlet
pcregrep
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
。)