`我的文件内容如下。
<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>
如果消息包含字符串&#34; xyz&#34;我需要检索文件的路径。和行动=&#34; D&#34; 在这里,我需要得到输出为/Demo/svn_dev/src/classes/Admin.cls 任何人都可以用grep命令语法帮助我。如果您需要任何进一步的信息,请告诉我。 谢谢你的帮助
答案 0 :(得分:2)
你不能用grep完成这项工作。这是使用GNU awk进行多字符RS和第3次arg进行匹配()的一种方法:
$ 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
答案 1 :(得分: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感知工具。