【问题标题】:SED match pattern in two lines两行 SED 匹配模式
【发布时间】:2016-07-14 07:07:47
【问题描述】:

对于我使用的两种模式之间的字符串替换:

我要更改的字符串:<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

【问题讨论】:

  • 如果您给我们一个有效的 XML 文件,我们可以给您一个使用 XML 解析器来执行此操作的解决方案。 sed 实用程序不适合解析和修改 XML 数据。
  • Obligatory link 到关于这个的著名 StackOverflow 帖子。

标签: regex sed


【解决方案1】:

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

使用 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 更改为“作者 2”,然后

$ 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>

【讨论】:

  • 好的,这是一个非常有趣的解决方案,因为 cygwin 有这个功能。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 2014-06-17
  • 2016-05-18
  • 1970-01-01
  • 2021-05-23
  • 2022-01-13
  • 2013-07-31
  • 2015-05-12
相关资源
最近更新 更多