【问题标题】:Add line above a particular XML tag and one line below of the ending XML tag在特定 XML 标记上方添加一行,在结束 XML 标记下方添加一行
【发布时间】:2018-07-27 13:47:34
【问题描述】:

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

<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

这会在&lt;appender name="def"&gt; 之上添加&lt;!--,但--&gt; 会添加到存在&lt;/appender&gt; 的所有行上。我只想在&lt;/appender&gt; 上添加--&gt;,它会在第一次匹配完成后进行搜索。

输出应该如下:

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

我尝试了很多类似的问题,但找不到。

【问题讨论】:

标签: python xml shell


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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>
    

    【讨论】:

    • 这将负责关闭文件描述符。我已经在间隔连续运行脚本,所以应该没有任何 FD 泄漏。
    • 是的,它只会关闭的文件描述符。其他的都保持不变
    猜你喜欢
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2010-12-11
    • 2018-08-21
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多