Bash

查找具有特定路徑的 XML 文件

  • August 1, 2021

我正在處理 XML 文件,每個文件都可能有幾十行。實際上有數百個這樣的文件,遍布一個目錄結構。是的,它是 Magento。

我需要找到包含該<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'

您可以嘗試xmlstarlet檢查sel路徑i是否存在,然後輸出f文件名:

find . -name '*.xml' -exec xmlstarlet sel -t -i '/foo/bar/boom/bang' -f -n {} +

使用安裝包xq中的 XML 解析器工具,根據 xq 輸出僅在退出狀態為 0 時列印文件名。yq

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,如果最後一個輸出值是 false 或 null,則設置為 1,如果沒有產生有效結果,則設置為 4。如果有任何使用問題或系統錯誤,jq 通常退出 2,如果有 jq 程序編譯錯誤,則退出 3,或者如果 jq 程序執行,則退出 0。

引用自:https://unix.stackexchange.com/questions/662839