我有一个xml文件:
<record name="rfPathProv">
<key name="pathId" value="1"/>
<key name="pathDirection" value="RX"/>
<field name="band" value="4"/>
</record>
<record name="rfPathProv">
<key name="pathId" value="1"/>
<key name="pathDirection" value="TX"/>
<field name="band" value="4"/>
</record>
我只需要使用bash脚本替换记录名=“rfPathProv”和key name =“pathId”value =“1”时的band值。请帮忙。提前谢谢。
答案 0 :(得分:1)
你可以尝试以下,绝不是完美的。在这个例子中,我将波段值改为10。
awk '/<\/record>/{a=0};{
a+=sub(/<record name="rfPathProv">/,"&")
a+=sub(/<key name="pathId" value="1"\/>/,"&")
if (a==2) {
sub(/<field name="band" value="[0-9]+"/,"&@")
sub(/"[0-9]+"@/,"\"10\"")
}
}1' originalfile > newfile
答案 1 :(得分:0)
这确实是一个xpath问题。使用xmlstarlet,您可以
xmlstarlet ed -u '//record[@name="rfPathProv" and ./key[@name="pathId" and @value="1"]]/field[@name="band"]/@value' -v 'newValue' file.xml > newfile.xml
输出(在为样本xml提供顶级节点之后)
<?xml version="1.0"?>
<records>
<record name="rfPathProv">
<key name="pathId" value="1"/>
<key name="pathDirection" value="RX"/>
<field name="band" value="newValue"/>
</record>
<record name="rfPathProv">
<key name="pathId" value="1"/>
<key name="pathDirection" value="TX"/>
<field name="band" value="newValue"/>
</record>
</records>