首页 > 解决方案 > 如何使用 SED 取消注释 XML 块

问题描述

如何使用 SED 从我的 xml 文件中取消注释包含过滤器标签的块?只有这个块应该被取消注释。其他注释掉的代码应该留在原处。

<a> test <a>
<!--
<filter>
    <filter-name>httpHeaderSecurity</filter-name>
    <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
    <async-supported>true</async-supported>
</filter>-->

<!-- <b> leave this one alone </b>-->

标签: linuxbashunixsed

解决方案


使用 GNU sed for -z,这将取消注释所有注释块,假设<!--并且-->不会出现在其他上下文中:

$ sed -z '
    s/@/@A/g; s/{/@B/g; s/}/@C/g; s/<!--/{/g; s/-->/}/g;
    s/{\([^}]*\)}/\1/g;
    s/}/-->/g; s/{/<!--/g; s/@C/}/g; s/{/@B/g; s/@A/@/g
' file
<a> test <a>

<filter>
    <filter-name>httpHeaderSecurity</filter-name>
    <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
    <async-supported>true</async-supported>
</filter>

 <b> leave this one alone </b>

如果您想取消注释某个特定块,请修改s/{\([^}]*\)}/\1/g为适合您的任何正则表达式,例如:

$ sed -z '
    s/@/@A/g; s/{/@B/g; s/}/@C/g; s/<!--/{/g; s/-->/}/g;
    s/{\([^}]*catalina[^}]*\)}/\1/g;
    s/}/-->/g; s/{/<!--/g; s/@C/}/g; s/{/@B/g; s/@A/@/g
' file
<a> test <a>

<filter>
    <filter-name>httpHeaderSecurity</filter-name>
    <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
    <async-supported>true</async-supported>
</filter>

<!-- <b> leave this one alone </b>-->

了解如何在源代码中查找搜索词,以了解之前/之后的所有替换都在做什么。


推荐阅读