我正在尝试使用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,则文本重新排列。我想跳过第一次出现。有什么帮助吗?
此外,当我第二次运行命令时,这些值会再次输入。有没有一种方法只能在不可用的情况下进行检查和更换?
答案 0 :(得分:2)
使用GNU sed,您可以使用
sed -i '/<\/rotate-log>/{:A;n;s#</rotate-log># insertvalue</rotate-log>#;bA}' file
该命令找到带有</rotate-log>
的行,然后
:A
-设置标签A
n
-丢弃当前模式空间值,并将下一行读入其中s#</rotate-log># insertvalue</rotate-log>#
-将</rotate-log>
替换为# insertvalue</rotate-log>
bA
-转到A
标签(读取下一行,替换并继续)。