С GNU sed для -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>
Если вы хотите раскомментировать один указанный c block, затем измените 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>-->
См. , как найти поисковый термин в исходном коде , для чего все подстановки до / после что делают.