私はXMLファイルを処理していますが、各ファイルの長さは数十行です。文字通り、何百ものファイルがディレクトリ構造に分散されています。はい、マゼントです。
この要素を含むファイルを見つける必要があります<foo><bar><boom><bang>
。タグ<boom><bang>
は他のタグの下で定義できます。フルパスを検索する必要があります。ただ閉じるタグやタグではありません。各タグの間には数十行があり、その間には異なるタグがあります。
<foo>
<hello_world>
... 50 lines ....
</hello_world>
<bar>
<giraffe>
... 50 lines ....
</giraffe>
<boom>
<bang>Vital information here</bang>
</boom>
</bar>
</foo>
定義されたファイルを検索するためのエレガントな* nixメソッドは何ですか<foo><bar><boom><bang>
?私は現在、最新のDebian派生ディストリビューションを使用しています。
説得力から遠い現在の解決策は次のとおりです。
$ grep -rA 100 foo * | grep -A 100 bar | grep -A 100 boom | grep bang | grep -E 'foo|bar|boom|bang'
答え1
パスが存在するかどうかをxmlstarlet
試した後、ファイル名を出力できます。sel
i
f
find . -name '*.xml' -exec xmlstarlet sel -t -i '/foo/bar/boom/bang' -f -n {} +
答え2
xq
XMLパーサーツールの使用yq
インストールパッケージそして、xq出力に基づく終了ステータスが0の場合にのみファイル名を印刷します。
find -type f -name '*.xml' -exec sh -c '
xq -e '.foo.bar.boom.bang' "$1" >/dev/null
' _ {} \; -print
-e は出力に従って終了ステータスコードを設定します。
man jq
このオプションの詳細については、次を参照してください。
-e / --exit-status:
最後の出力値が false または null でない場合、jq の終了状態を 0 に設定し、有効な出力が生成されない場合は 1 に設定します。その結果、4に設定されました。通常、jqは使用上の問題やシステムエラーがある場合は2で終了し、jqプログラムコンパイルエラーがある場合は3で終了し、jqプログラムが実行されている場合は0で終了します。