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

时间:2018-07-27 13:47:35

标签: python xml shell

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

<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>

我尝试搜索许多类似问题,但找不到。

2 个答案:

答案 0 :(得分:0)

将以下内容保存到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脚本被写入一个单独的文件中。如果您愿意,可以轻松地将其转换为嵌入式版本。

答案 1 :(得分:0)

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>