linux - 如何使用 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>-->
解决方案
使用 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>-->
了解如何在源代码中查找搜索词,以了解之前/之后的所有替换都在做什么。
推荐阅读
- heroku - 如何使用免费测功机在 Heroku 上保持 App 唤醒
- docker - Kubernetes 中的 Angular 无法提取图像
- python-2.7 - 无法验证 Twitch EventSub 签名
- google-analytics-4 - 更改 Google Analytics 4 中的默认 URL
- flutter - 颤振使用syncfusion创建pdf
- excel - BI Publisher 预览后所有布尔值均为 FALSE
- django - 如何从视图而不是模板分配外键值并保存到Django中的数据库中
- c# - 如何在 C# 中使用 WMI 事件检测 USB 摄像头断开连接?
- javascript - Rails 6 - 如何在 js.erb 文件中引用 javascript 文件变量?
- javascript - Math.sqrt() 缩写 javascript