我有一个文件,内容如下:
<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
说明:
- 如果出现所需的图案,请对其进行标记,然后打印注释标记
- 如果出现结束模式,请附加结束注释
- 打印修改后的行
为了在线显示,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>