Command-Line

在目錄中遞歸搜尋所有 xml 文件以查找特定標記並 grep 標記的值

  • May 16, 2021

Ubuntu 14.04 可信賴的塔爾。

假設我有一個名為“testmag”的目錄,其中可能包含 100 個 xml 文件和目錄,而這些目錄又包含許多 xml 文件。我不知道任何 xml 文件的名稱,但我知道其中一個包含 tag <dbname>....</dbname>

現在如何找到包含上述標籤的文件並將標籤的值grep作為終端中的輸出

這是一個解決方案,find它還將輸出包含匹配項的文件的文件名:

find . -name "*.xml" -exec grep '<dbname>' {} \;             \
                    -exec echo -e {}"\n" \;                 \
                    | sed 's/<dbname>\(.*\)<\/dbname>/\1/g'

解釋

  1. find . -name "*.xml"從目前目錄遞歸查找所有xml文件
  2. -exec grep '<dbname>' {} \;在每個文件上搜尋模式<dbname>
  3. -exec echo -e {}"\n" \;echo 文件名 + 新行(-e選項使 echo 解釋\n
  4. | sed 's/<dbname>\(.*\)<\/dbname>/\1/g'管道輸出以僅列印標籤sed之間包含的欄位。<dbname></dbname>

注意 1:您可以在您的輸出中格式化輸出,echo -e ...以使每個文件的結果清晰排列,例如通過添加新行或下劃線行來滿足您的需要。

注意2:每個文件的路徑將相對於.(例如./subfolder1/file.xml)給出。如果您想要絕對路徑,請選擇find $PWD -name ....

使用適當的 XML 解析器來解析 XML:

shopt -s globstar nullglob
for file in **/*.xml; do 
   dbname=$(xmlstarlet sel -t -v '//dbname' "$file")
   [[ -n "$dbname" ]] && printf "%s\t%s\n" "$file" "$dbname"
done

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