2016-08-08 46 views
-2

`我有如下文件的內容。帶兩個搜索標準的grep命令

<path 
action="A" 
kind="file">/Demo/svn_dev/src/classes/Util - Copy.cls</path><path 
action="D" 
kind="file">/Demo/svn_dev/src/classes/Admin.cls</path> 
<path action="M" 
kind="file">/Demo/svn_dev/src/classes/AdminUtilCtrl.cls</path> 
</paths> 
<msg>xyz</msg> 

我需要的,如果消息包含字符串「XYZ」,並採取行動以檢索文件的路徑=「d」 在這裏,我需要讓出把儘可能/演示/ svn_dev/src目錄/班/管理員。 cls 任何人都可以幫助我使用grep命令語法。如果您需要更多信息,請告訴我。 感謝您的幫助

+2

想在這裏展示一些功夫? – sjsam

回答

2

你不能用grep做那件事。下面是用GNU AWK多焦RS和比賽的第三個參數()來做到這一點的一種方法:

$ cat tst.awk 
BEGIN { RS="\\s*</[^>]+>\\s*" } 
match($0,/^<path\s*action="D"[^>]+>(.*)/,a) { act = a[1] } 
/^<msg>xyz$/ { print act } 

$ awk -f tst.awk file 
/Demo/svn_dev/src/classes/Admin.cls 
0

grep您可以在第一圖案的存在狀態,提取第二,需要一點點下班後提取信息

$ grep -q '<msg>xyz</msg>' file && grep -A1 'action="D"' file | 
    sed -n -r '$s/[^>]*>(.*)<.*/\1/p' 

/Demo/svn_dev/src/classes/Admin.cls 

但是,如果您的換行符與發佈的文本不同,則可能會失敗。也許更好使用XML感知工具。