SED匹配模式有两行

时间:2016-07-14 07:07:48

标签: regex sed

为了替换两种模式之间的字符串,我使用:

我想要更改的字符串:<name>FOO</name> 我用这个:

s#(<name>).*?(</name)#\1xxxxxxxxxxx\2#g;

我正在寻找解决方案,当第一个模式存在于两行中时:

<attributes>
      <name>AUTOR</name>
      <value>FOO</value>
      <type>1</type>
 </attributes>

我想替换BAR 我尝试过类似的东西,但没有结果:

s#(AUTOR</name>\n\r<value>).*?(</value)#\1xxxxxxxxxxx\2#g;

编辑: 我确信使用XMLStarlet代替SED

1 个答案:

答案 0 :(得分:1)

面向行的工具通常不适合解析和修改XML数据。而不是sed,请考虑使用类似XMLStarlet的内容。

使用XMLStarlet:

$ cat data.xml
<attributes>
      <name>AUTOR</name>
      <value>FOO</value>
      <type>1</type>
 </attributes>

$ xml ed -u '/attributes/value' -v NEWFOO data.xml
<?xml version="1.0"?>
<attributes>
  <name>AUTOR</name>
  <value>NEWFOO</value>
  <type>1</type>
</attributes>

如果您有更有趣的XML:

<books>
  <book>
    <attributes>
      <name>Author 1</name>
      <value>FOO</value>
      <type>1</type>
    </attributes>
  </book>
  <book>
    <attributes>
      <name>Author 2</name>
      <value>FOO</value>
      <type>1</type>
    </attributes>
  </book>
</books>

..并且您只想更改FOO仅为&#34;作者2&#34;,然后

$ xml ed -u '//attributes[name="Author 2"]/value' -v NEWFOO data.xml
<?xml version="1.0"?>
<books>
  <book>
    <attributes>
      <name>Author 1</name>
      <value>FOO</value>
      <type>1</type>
    </attributes>
  </book>
  <book>
    <attributes>
      <name>Author 2</name>
      <value>NEWFOO</value>
      <type>1</type>
    </attributes>
  </book>
</books>