Linux 2g在sed中无法跳过匹配的第一次出现
我试图用sed替换xml文件中的一些文本。我可以替换我的文本,但我想跳过第一次。我正在使用2g,但它不工作。不会显示任何错误,但不会对文件进行任何更改 我的Xml文件: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
<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不,你不能。你需要一些更高级的编程逻辑。没问题。这已经完成了我的工作。非常感谢您抽出时间。