Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 2g在sed中无法跳过匹配的第一次出现_Linux_Shell_Unix_Sed_Sh - Fatal编程技术网

Linux 2g在sed中无法跳过匹配的第一次出现

Linux 2g在sed中无法跳过匹配的第一次出现,linux,shell,unix,sed,sh,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-lo

我试图用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>
10830
真的
25600
真的
32300
真的
13456
真的
我的预期产出:

<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>
10830
真的
25600
真插入值
32300
真插入值
13456
真插入值
我正在使用下面的sed命令

sed -i 's#</rotate-log>#insertvalue</rotate-log>#2g' myfile.xml
sed-i的##insertvalue#2g'myfile.xml
上述命令不起作用。如果删除2g,则文本将重新分解。我想跳过第一个事件。有什么帮助吗


另外,当我第二次运行该命令时,值将再次输入。是否有办法仅在不可用时进行检查和更换?

如果使用GNU,您可以使用

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

该命令查找带有
的行,然后

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

也许从第三行开始
sed-i'3,$s##insertvalue#g'文件
我上面给出的文件是我的参数开始的文件的一部分。此外,此参数将位于不同文件的不同行。还有其他方法吗?但是你的图案一行只能出现一次,对吗?尝试使用sed-i'/{:A;n;s###insertvalue#bA}文件。检查一下,这很有效。谢谢。你能帮我解决我的第二个问题吗?那就是,只有当价值不存在时,我才需要更换。仅当值不存在时才需要替换@wiktor stribiżew@Rajesh我想你可以只使用sed-I'/{:A;n;s#(insertvalue\){0,1\}insertvalue#bA}文件非常感谢,它使我的工作变得简单。再次非常感谢。最后一件事,有没有办法提及要跳过的事件?就像我们在普通sed命令中使用2g、3g、4g一样。@Rajesh不,你不能。你需要一些更高级的编程逻辑。没问题。这已经完成了我的工作。非常感谢您抽出时间。