在Bash中搜索和替换XML格式的文本块

时间:2017-04-22 10:13:32

标签: regex xml bash xmlstarlet

我一直在试图找出如何搜索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。

1 个答案:

答案 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