为何同一正则表达式在grep中可用但在sed中报未终止地址正则错误?
sed 命令报错原因及正确用法
报错核心原因
你的命令混淆了 grep 和 sed 的基础语法规则:
- grep 可以直接将正则表达式作为位置参数传入,不需要额外语法包裹;但 sed 要求所有用于行匹配的正则表达式,必须由成对的定界符(通常用
/)包裹,形成「定界符+正则+定界符」的标准地址结构。 - 你当前执行的
sed -E '\-\- .*$' *.sql中,传入的正则没有被任何定界符包裹。错误信息里提示的 char 7 位置,刚好对应你写的正则内容里的*符号:sed 从表达式开头解析到这个位置时,全程没有碰到用来标记正则边界的定界符,完全无法判断正则的起始和结束位置,因此抛出unterminated address regex错误。 - 你写的正则逻辑本身没有问题——匹配「两个连字符加空格」的MySQL合规注释规则,在grep中能正常生效,在sed里只要补上要求的语法结构就能直接复用。
对应需求的正确命令写法
提取所有带合规注释的行(和原grep命令效果一致)
如果要实现和 grep -E '\-\- .*$' *.sql 完全一致的输出效果,需要配合sed的打印命令使用:sed -n -E '/\-\- .*$/p' *.sql
参数说明:
- 前后的
/就是正则定界符,把你原本的匹配规则包裹在中间,告诉sed这是需要匹配的正则内容-n用于关闭sed默认的全量行打印机制,避免匹配到的行被重复输出- 结尾的
p是sed内置命令,代表「匹配到的行执行打印操作」
删除所有带合规注释的行
如果要过滤掉所有匹配注释的行,可以直接用sed的删除命令:
- 默认输出过滤后的结果到终端,不修改原文件:
sed -E '/\-\- .*$/d' *.sql - 如果需要直接修改源文件、替换原内容,加上
-i参数即可:sed -i -E '/\-\- .*$/d' *.sql
小提示:连字符
-在正则中如果不放在方括号[]内部,不属于特殊元字符,实际使用时可以省略转义,直接写/-- .*$/也能正常匹配。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

