首页 文章

sed:在模式匹配后在N行上执行替换

提问于
浏览
1

我试图使用sed在特定模式之后仅在N行上执行替换 .

看看sed手册页似乎应该可以使用addr1,N语法 . 但我无法让它发挥作用 .

<data>
  <variable>DebuggerItem.Count</variable>
  <value type="int">2</value>
 </data>
 <data>
  <variable>Version</variable>
  <value type="int">1</value>
 </data>

我正在执行的替换查找此标记中的数字并将它们递增1.它如下所示 .

sed -r 's/([ ]*<value type=)\"(int)\"(>)([0-9]*)(.*)/echo "\1\\"\2\\"\3$((\4+1))\5"/ge' filename

我现在想要将替换限制在包含“DebuggerItem.Count”之后的N行 . 在我当前的实例中,N是1,但我有另一个例子,我希望在匹配的一行之后执行5行,所以N将是5 .

它可以用更复杂的替换来执行,但理想情况下我想了解更多关于使用sed地址的信息 .

注意:我在搜索替换中使用双引号时遇到了一些问题,因为我需要为以下回声双重转义它们 . 因此搜索替换有点令人费解 . 我很抱歉 .

1 回答

  • 1

    我同意@Birei;请勿使用 sed 执行此操作 . 如果您使用基于行的工具完成任务,那么没有人希望您的XML工具能够破坏_192243 . 事情会以可怕的方式破裂,他们可能会在你忘记你在那里建造的东西以及为什么这两个月后做到这一点 .

    有很多工具可以很好地解析和转换XML . 例如,使用 xmlstarlet ,您的问题可以像这样解决:

    xmlstarlet ed -u '//data[variable="DebuggerItem.Count"]/value' -x '. + 1' filename.xml
    

    这里 //data[variable="DebuggerItem.Count"]/value 是一个XPath表达式,它选择文档中 data 节点的 value 子节点,其 variable 子节点的值为 "DebuggerItem.Count". + 1 是另一个XPath表达式,表示当前节点的值加1 .

    另见here .

    如果你一直都在使用 sed ,并且放心它会回来咬你,你可以在文件中找到 DebuggerItem.Count 之后将 s 命令的应用限制为三行:

    #               new bit            from here it's the same as before.
    #       vvvvvvvvvvvvvvvvvvvvvvvv  vvvvvvv
    sed -r '/DebuggerItem\.Count/,+3 s/([ ]*<value type=)\"(int)\"(>)([0-9]*)(.*)/echo "\1\\"\2\\"\3$((\4+1))\5"/ge' foo.xml
    

相关问题