在特定XML标记上方添加一行,在结束XML标记下方添加一行



我有一个文件,内容如下:

<root>
<appender name="abc">
some lines
</appender>
<appender name="def">
some lines
</appender>
<appender name="qaz">
some lines
</appender>
</root>

我想在下面发表评论:

<!--
<appender name="def">
some lines
</appender>-->

所做的是

sed -i '/<appender name="def"/s/^/<--/;/</appender>/s/$/-->/' file.xml

这在<appender name="def">之上添加<!--,但在存在</appender>的所有行上添加-->。我只想在第一次匹配完成后获得搜索的</appender>上添加-->

输出应如下:

<root>
<appender name="abc">
some lines
</appender>
<!--
<appender name="def">
some lines
</appender>-->
<appender name="qaz">
some lines
</appender>
</root>

我试着搜索了很多类似的问题,但没有找到

将以下内容保存到process.awk

/<appender name="def">/ {
show = 1
print "<!--"
}
/</appender>/ {
if( show == 1 )
{
$0 = $0 "-->"
show = 0
}
}
{
print
}

并使用

awk -f process.awk file.xml

说明:

  1. 如果出现所需的图案,请对其进行标记,然后打印注释标记
  2. 如果出现结束模式,请附加结束注释
  3. 打印修改后的行

为了在线显示,awk脚本被写在一个单独的文件中。如果您愿意,可以很容易地将其转换为内联版本。

dibery的答案看起来很棒,但由于您也标记了python,我将提供一个简单的脚本来完成您的工作。

with open("file.xml", "r") as r:
lines = r.readlines()
gotcha = False                 # Just a flag to know if we catched the field
with open("file.xml", "w") as w:
for k in range(len(lines)):
if '<appender name="def">' in lines[k]:
w.write("<!--n") 
gotcha = True      # We got it!
w.write(lines[k])
if '</appender>' in lines[k] and gotcha:
w.write('-->n')
gotcha = False     # We have done our job, this avoids commenting every other '</appender>' field

输出

<root>
<appender name="abc">
some lines
</appender>
<!--
<appender name="def">
some lines
</appender>
-->
<appender name="qaz">
some lines
</appender>
</root>

最新更新