说我有以下XML:
<app-deployment>
<name>gr1</name>
<target>AdminServer</target>
<module-type>ear</module-type>
<source-path>/u01/app/wls1035_homes/wls1035_9999/grc864</source-path>
<security-dd-model>DDOnly</security-dd-model>
<staging-mode>stage</staging-mode>
</app-deployment>
<app-deployment>
<name>gr2</name>
<target>AdminServer</target>
<module-type>ear</module-type>
<source-path>/u01/app/wls1035_homes/wls1035_9999/grc864</source-path>
<security-dd-model>DDOnly</security-dd-model>
<staging-mode>nostage</staging-mode>
</app-deployment>
<app-deployment>
<name>gr3</name>
<target>AdminServer</target>
<module-type>ear</module-type>
<source-path>/u01/app/wls1035_homes/wls1035_9999/grc864</source-path>
<security-dd-model>DDOnly</security-dd-model>
</app-deployment>
如何提取staging-mode标签的值,比如名为gr2的app-deployment?
答案 0 :(得分:1)
许多人(包括我自己)会告诉你,使用基于reg-ex的工具解析xml是一件愚蠢的事,并且你应该使用专为xml解析而设计的工具。 Xpath应该适用于此,xmlstarlet将是一个可以快速安装和使用的软件包。
那就是说,假设你的数据总是很好,你可以很容易地制作一个awk脚本来搜索1个模式,设置一个标志,寻找另一个模式,设置一个标志等等。你已找到最终目标,清理该行以提取你想要的数据。
set -- gr2
{ cat - <<-EOS
<app-deployment>
<name>gr2</name>
<target>AdminServer</target>
<module-type>ear</module-type>
<source-path>/u01/app/wls1035_homes/wls1035_9999/grc864</source-path>
<security-dd-model>DDOnly</security-dd-model>
<staging-mode>nostage</staging-mode>
</app-deployment>
EOS
} | awk '
/[<]app-deployment/{a=1}
a && /[<]name[>]'"$1"'/{n=1}
a && n && /[<]staging-mode[>]/{
sub(/[<]staging-mode[>]/,"", $0)
sub(/[<]\/staging-mode[>]/,"",$0)
print $0
exit
}
#dbg { print "a=" a "\tn=" n }
'
输出
nostage
set -- gr3
和{ cat ... } |
是一个测试工具,你可以将它包装成一个shell脚本,即。
cat printXMLarg.bash
#!/bin/bash
targ=$1; shift
awk '
/[<]app-deployment/{a=1}
a && /[<]name[>]'"${targ}"'/{n=1}
a && n && /[<]staging-mode[>]/{
sub(/[<]staging-mode[>]/,"", $0)
sub(/[<]\/staging-mode[>]/,"",$0)
print $0
exit
}
#dbg { print "a=" a "\tn=" n }
' "${@}"
并调用
printXMLarg.bash gr3 *.xml
第二部分未经测试。如果您遇到问题,请告诉我。
我希望这会有所帮助