使用sed删除YAML配置字符串数组元素时正则表达式不生效如何解决
失效原因
- 默认sed使用基础正则表达式(BRE)语法,你写的正则存在两处不兼容问题:
- BRE规则中没有
\s这个空白符预定义匹配符,写\s只会被识别为普通的s字符,匹配不到空格 - BRE规则中表示「匹配1次及以上」的量词
+必须转义为\+才能生效,直接写+会被当做普通加号字符匹配
上述两个问题导致你的正则完全匹配不到目标行的"ecs", "message"片段,所以命令没有生效。
- BRE规则中没有
可直接运行的修复方案
方案1:适配默认BRE语法(无需额外参数,兼容所有平台sed)
把空白匹配逻辑替换为sed通用的空白字符类匹配:
sed 's/"ecs",[[:space:]]\{1,\}"message"/"ecs"/' myconf.yml
其中[[:space:]]匹配所有空白字符(空格、制表符等),\{1,\}等价于正则中的+,表示匹配1次及以上。
方案2:启用扩展正则(语法更简洁,GNU sed通用)
给sed加-E参数开启扩展正则表达式(ERE)规则,此时\s和+都可以直接使用:
sed -E 's/"ecs",\s+"message"/"ecs"/' myconf.yml
补充:直接修改原文件的写法
如果需要直接修改myconf.yml而不是输出到终端,可以加-i参数,同时会自动生成备份文件避免改错:
# 以方案1为例,执行后会生成myconf.yml.bak备份文件 sed -i.bak 's/"ecs",[[:space:]]\{1,\}"message"/"ecs"/' myconf.yml
内容的提问来源于stack exchange,提问作者pepsi
相关产品推荐
相关产品推荐

