特定の値を含むXMLファイルの検索

特定の値を含むXMLファイルの検索

約10K個のXMLファイルを含むフォルダがあります。それぞれは次のとおりです。

...
<object>
<name>Cat</name>
</object>
<object>
<name>Cow</name>
</object>
...

人、猫、犬、牛などname...猫や犬を含む唯一のxmlファイルを選択したいです。どうすればいいですか?

ベストアンサー1

あなたのようなXML文書のノードから全体または値を取得するには、Cat次のように使用できます。Dognamexmlstarlet

xmlstarlet sel -t -v '//object/name[text() = "Cat" or text() = "Dog"]' file.xml

Catこれにより、sumという単語がドキュメントにそのノードの子ノードの値として存在する場合、出力としてsumという単語が生成されます。そのノードの子以外のノードがある場合、または一部のノードに属性などがある場合は、これを正しく実行することは困難です。Dogobjectnamegrepnameobjectname

残念ながら、XML入力ファイルに何も見つからない場合は、ゼロ以外の終了状態で終了しないため、出力があることを確認するために末尾にを追加する必要がありますxmlstarlet(これは次のステップで使用されます)。grep:

xmlstarlet sel -t -v '//object/name[text() = "Cat" or text() = "Dog"]' file.xml | grep '.'

その後、すべての10,000個のファイルで実行できますfind

find . -type f -name '*.xml' -exec sh -c '
    xmlstarlet sel -t -v "//object/name[text() = \"Cat\" or text() = \"Dog\"]" "$1" |
    grep -q "."' sh {} ';' -print

まず、現在のディレクトリまたはその下で名前付きファイルを探します.xml。これらのファイルごとにxmlstarlet文字列を実行して、正しいXMLノードから合計を抽出し、見つかった項目があるかどうかをCat確認します。そのオプションを使用して実行すると、ユーティリティは静かになりますが、一致するものがあるかどうかに応じて適切な終了状態で終了します。Doggrepxmlstarletgrep-q

grep何も見つかると、findデータを含むファイルのパス名を印刷します。

おすすめ記事