2g无法正常运行以跳过首次匹配

时间:2020-04-19 18:02:55

标签: linux shell unix sed sh

我正在尝试使用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,则文本重新排列。我想跳过第一次出现。有什么帮助吗?

此外,当我第二次运行命令时,这些值会再次输入。有没有一种方法只能在不可用的情况下进行检查和更换?

1 个答案:

答案 0 :(得分:2)

使用GNU sed,您可以使用

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

请参见online sed demo

该命令找到带有</rotate-log>的行,然后

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