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

时间:2015-02-10 14:26:33

标签: regex bash unix replace sed

我尝试使用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

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

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

注意:我在搜索替换中使用双引号时遇到了一些问题,因为我需要为以下回声双重转义它们。所以搜索替换有点复杂。道歉。

1 个答案:

答案 0 :(得分:1)

我同意@Birei;请勿使用sed执行此操作。如果在无害的地方添加换行符或重新排序的节点,没有人希望您的XML工具能够中断,如果您使用基于行的工具来完成任务,那么就会发生这种情况。事情会以可怕的方式破裂,他们可能会在你忘记你在那里建造的东西以及为什么会这样做两个月后这样做。

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

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

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

另见here

如果你非常喜欢使用sed,并且放心它会回来咬你,你可以在找到{{s之后将DebuggerItem.Count命令的应用限制为三行。 1}}在这样的文件中:

#               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