我有一个XML响应,每当BillPlan =“UBM - A / A”时我需要从中提取ObjDevice的值。你能帮我用shell脚本做同样的事吗
<Txn>
<TxnName>Spectrum-AlertSite-Component_spectrum.engprod_InstantUpgradeEdge_GetProductOffersByAccount_getProductOffersByAccountValid</TxnName>
<TxnDetail Monitor="y" Notify="y" PingError="n"
TraceError="y" Interval="5" TimeOut="300"
ObjDevice="318373" BillPlan="UBM - A/A" MaxSteps="50"
/>
</Txn>
<Txn>
<TxnName>Spectrum-AlertSite-Component_spectrum.engprod_InstantUpgradeEdge_GetProductOffersByAccount_getProductOffersByAccountValid</TxnName>
<TxnDetail Monitor="y" Notify="y" PingError="n"
TraceError="y" Interval="5" TimeOut="300"
ObjDevice="318377" BillPlan="UBM - A/A" MaxSteps="50"
/>
答案 0 :(得分:1)
使用XMLStarlet:
xmlstarlet sel -t -m '//TxnDetail[@BillPlan="UBM - A/A"]' \
-v ./@ObjDevice -n \
<in.xml
答案 1 :(得分:1)
使用我的Xidel,您可以:
xidel /tmp/foo.xml -e '//TxnDetail[@BillPlan="UBM - A/A"]/@ObjDevice'
答案 2 :(得分:1)
如果你没有一个特殊的工具来处理XML文件,并且你总是在同一行中有两个值,那么你可以执行:
grep 'BillPlan="UBM - A/A"' | sed 's,.*ObjDevice="\([0-9]*\)" BillPlan="UBM - A/A".*,\1,"
很抱歉,如果我不使用sed过滤但不熟悉sed而且也无法访问* nix,但也许其他人可以给我们短版
答案 3 :(得分:1)
我安装了libxml2
(非常可能在任何GNU / Linux系统上):
xmllint --xpath '//TxnDetail[@BillPlan="UBM - A/A"]/@ObjDevice' input.xml