2g 无法在 sed 中工作以跳过匹配项的第一次出现

2g is not working in sed to skip the first occurrence of a match

我正在尝试使用 sed 替换 xml 文件中的一些文本。我可以替换我的文本,但我想跳过第一次出现的内容。我正在使用 2g,但它不工作。没有错误显示,但文件没有变化。

我的 Xml 文件:

<file-min-size>10830</file-min-size>
      <rotate-log>true</rotate-log>
<file-min-size>25600</file-min-size>
      <rotate-log>true</rotate-log>
<file-min-size>32300</file-min-size>
      <rotate-log>true</rotate-log>
<file-min-size>13456</file-min-size>
      <rotate-log>true</rotate-log>

我的预期输出:

<file-min-size>10830</file-min-size>
      <rotate-log>true</rotate-log>
<file-min-size>25600</file-min-size>
      <rotate-log>true insertvalue</rotate-log>
<file-min-size>32300</file-min-size>
      <rotate-log>true insertvalue</rotate-log>
<file-min-size>13456</file-min-size>
      <rotate-log>true insertvalue</rotate-log>

我正在使用下面的 sed 命令。

sed -i 's#</rotate-log>#insertvalue</rotate-log>#2g' myfile.xml

以上命令无效。如果我删除 2g,则文本正在重新排列。我想跳过第一次出现。有什么帮助吗?

同样,当我 运行 第二次执行命令时,值又重新输入了。有没有办法只在不可用时检查和更换?

使用 GNU sed,您可以使用

sed -i '/<\/rotate-log>/{:A;n;s#</rotate-log># insertvalue</rotate-log>#;bA}' file

online sed demo

命令找到带有</rotate-log>然后

的行
  • :A - 设置标签 A
  • n - 丢弃当前模式 space 值并将下一行读入其中
  • s#</rotate-log># insertvalue</rotate-log># - 将 </rotate-log> 替换为 # insertvalue</rotate-log>
  • bA - 转到 A 标签(读取下一行,替换,继续)。