[英]shell script to get values of elements in a xml after searching for a particular string
我正在使用以下xml文件
<?xml version="1.0" encoding="UTF-8"?>
<log>
<logentry revision="31">
<date>2016-06-07</date>
<paths>
<path kind="file" action="M">components/C_MyAccountChangePassword.component</path>
</paths>
<msg>R002</msg>
</logentry>
<logentry revision="26">
<date>2016-06-07</date>
<paths>
<path kind="file" action="M">applications/Admin_Util.app</path>
</paths>
<msg>R001 added comments</msg>
</logentry>
</log>
我必須搜索類似的字符串
grep "R001"
我需要獲取<path>
標記中提到的文件。任何人都可以幫助我如何實現它。 我嘗試了一些類似的東西
grep -A1 "<msg>R001" log.xml | grep "<path>"
但沒有獲得所需的輸出。
將grep與xml結合使用通常不是一個好主意。 我建議您使用xslt或xmllint之類的適當工具(來自libxml )
你可能會
xmllint --xpath '//logentry[contains(msg,"R001")]/paths/path' your.xml
並得到
<path kind="file" action="M">applications/Admin_Util.app</path>
可以更容易地進行后處理,或者將xsltproc(同樣來自libxml / libxslt )與xslt樣式表一起使用,以使輸出的形狀適合您的需求。
如果確定您的xml是否以某種方式格式化並且所有<logentry>
都在一行中,則基於常規語法正則表達式的方法可能是可行的,但是在一般情況下(例如,像您的示例一樣)全部在一行中,這會很困難。
正如Stefan Hegny指出的那樣, grep
可能不是處理從xml
標記中提取數據的最佳方法,但是,如果您像OP中那樣確定文件的格式(以換行符分隔的條目),則可以使用以下邏輯:
grep -B 3 -w "R001" file | awk -F '[<>]' '/path/{print $3}'
將產生輸出為applications/Admin_Util.app
邏輯是獲取搜索模式並根據需要提取n
行,然后部署awk
進行其余操作。 如果您有興趣將值存儲到腳本中的變量中,則可以使用tr
忽略換行
#!/bin/bash
xmlContent=$(grep -B 3 -w "R001" file | awk -F '[<>]' '/path/{print $3}' | tr -d '\n')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.