我一直在试图找出如何搜索XML格式的文本块并在Bash中修改它。我想要处理的文件是一个带有XML格式的模拟文件。假设该文件包含多个XML stataments块:
<mote>
<breakpoints />
<interface_config>
org.contikios.cooja.interfaces.Position
<x>0.0</x>
<y>75.0</y>
<z>0.0</z>
</interface_config>
<interface_config>
org.contikios.cooja.mspmote.interfaces.MspClock
<deviation>1.0</deviation>
</interface_config>
<interface_config>
org.contikios.cooja.mspmote.interfaces.MspMoteID
<id>4</id>
</interface_config>
<motetype_identifier>sky2</motetype_identifier>
</mote>
我想搜索的是一个XML语句块:
<id>4</id>
</interface_config>
<motetype_identifier>sky2</motetype_identifier>
并将其替换为
<id>4</id>
</interface_config>
<motetype_identifier>sky3</motetype_identifier>
这些语句之前和之后的其余XML语句将保持不变。这将使我能够在Bash的脚本中将mote类型节点4从sky2更改为sky3。
答案 0 :(得分:2)
xmlstarlet ed --omit-decl -u "//mote[interface_config/id='4']/motetype_identifier" -v 'sky3' file.xml
输出:
<mote>
<breakpoints/>
<interface_config>
org.contikios.cooja.interfaces.Position
<x>0.0</x>
<y>75.0</y>
<z>0.0</z>
</interface_config>
<interface_config>
org.contikios.cooja.mspmote.interfaces.MspClock
<deviation>1.0</deviation>
</interface_config>
<interface_config>
org.contikios.cooja.mspmote.interfaces.MspMoteID
<id>4</id>
</interface_config>
<motetype_identifier>sky3</motetype_identifier>
</mote>
如果要在inplace中编辑file.xml,请添加选项-L。
请参阅:xmlstarlet ed --help