如何使用sed或Perl正则注释OpenAM的web.xml指定servlet-mapping块
可行实现方案
两种工具的实现方式如下:
Perl 方案(兼容性更强,适配不同换行/缩进格式)
perl处理跨行文本更简单,直接读取整个文件匹配即可,命令如下:
perl -0777 -pi -e 's|(<servlet-mapping>\s*.*?<url-pattern>/ccversion/.*?</servlet-mapping>)|<!-- $1 -->|sg' web.xml
参数说明:
-0777:一次性读取整个文件内容,支持跨行匹配s修饰符:让.可以匹配换行符g修饰符:全局匹配,存在多个符合条件的块也可同时处理- 用
|作为正则分隔符,无需转义路径中的/字符
Sed 方案
sed默认按行处理,需要用范围匹配把整个目标块加载到模式空间后再处理,命令如下:
sed -i '/<servlet-mapping>/{:a;N;/<\/servlet-mapping>/!ba;/\/ccversion/{s/^/<!-- /;s/$/ -->/}}' web.xml
逻辑说明:
- 匹配到
<servlet-mapping>行后进入块处理逻辑 :a定义循环标签,N把下一行加入当前处理的模式空间,没读到</servlet-mapping>闭合标签就一直循环,把完整的servlet-mapping块加载到内存- 检测当前块是否包含
/ccversion,匹配成功则在块开头加<!--,末尾加--> - 怕出错可以先加备份后缀测试,比如把
-i改成-i.bak,验证修改没问题再删除.bak后缀的备份文件
操作提示
执行命令前建议先备份原web.xml文件,避免配置错误影响服务运行。
内容的提问来源于stack exchange,提问作者Tiberio
相关产品推荐
相关产品推荐

