如何移除文件指定代码块的--注释?sed命令结果重复问题解决
DB2存储组配置注释移除的正确sed处理方法
问题背景
现有如下DB2存储组配置代码:
-- ***************************************************************************** -- ** Storage group name = IBMSTOGROUP -- ** Storage group ID = 0 -- ** Data tag = None -- ***************************************************************************** -- SET STOGROUP PATHS FOR IBMSTOGROUP -- ON '/udb/ss/DI10' -- , '/udb/ss/DI9' -- , '/udb/ss/DI8' -- , '/udb/ss/DI7' -- , '/udb/ss/DI6' -- , '/udb/ss/DI5' -- , '/udb/ss/DI4' -- , '/udb/ss/DI3' -- , '/udb/ss/DI2' -- , '/udb/ss/DI1' -- ;
需要移除SET STOGROUP PATHS相关代码行前的--注释符。尝试执行以下sed命令后出现内容重复问题:
sed -n "/-- ON/,/DI1.*$/c\ON '/udb/ss/DI1','/udb/ss/DI2','/udb/ss/DI3'/" file
期望得到的正确输出为:
-- ***************************************************************************** -- ** Storage group name = IBMSTOGROUP -- ** Storage group ID = 0 -- ** Data tag = None -- ***************************************************************************** SET STOGROUP PATHS FOR IBMSTOGROUP ON '/udb/ss/DI10' , '/udb/ss/DI9' , '/udb/ss/DI8' , '/udb/ss/DI7' , '/udb/ss/DI6' , '/udb/ss/DI5' , '/udb/ss/DI4' , '/udb/ss/DI3' , '/udb/ss/DI2' , '/udb/ss/DI1' ;
正确解决方法
可以使用以下sed命令精准移除目标行的注释符:
方法一:按行范围匹配替换
sed '/^-- SET STOGROUP PATHS/,/^-- ;/s/^-- //' input_file
逻辑说明:
- 匹配从
-- SET STOGROUP PATHS开头的行,到-- ;开头的行的连续范围 - 对范围内的每一行,移除行首的
--(包含--后的空格)
方法二:按行内容特征匹配替换
如果目标行分散,可通过扩展正则匹配特征行:
sed -E '/^-- (SET STOGROUP PATHS|ON|,|;)/s/^-- //' input_file
逻辑说明:
- 启用扩展正则模式
-E,匹配行首为--且后续内容是SET STOGROUP PATHS、ON、逗号,或分号;的行 - 对匹配到的行移除行首的
--
执行上述任意命令后,即可得到符合预期的无注释配置代码。
内容的提问来源于stack exchange,提问作者gowri
相关产品推荐
相关产品推荐

