为什么这个正则表达式在grep中有效但在sed中无效?

我有两个正则表达式:

  1. $ grep -E '-- .*$' *.sql
  2. $ sed -E '-- .*$' *.sql

(我正在尝试 grep 具有注释的 sql 文件中的行并删除具有注释的 sql 文件中的行)

grep 命令使用这个正则表达式;但是,sed 返回以下错误:

sed: -e expression #1, char 7: unterminated address regex

我用 sed 做错了什么?

(如果你不熟悉这种类型的MySql注释,sql注释需要两个连字符后面的空格)

回答

您正在尝试使用:

sed -E '-- .*$' *.sql

这里的sed命令不正确,因为您并没有真正告诉sed做某事。

它应该是:

sed -n '/-- /p' *.sql

等价物grep是:

grep -- '-- ' *.sql

甚至更好的固定字符串搜索:

grep -F -- '-- ' *.sql

使用--分离图案和参数grep命令。

-如果它在括号表达式(或字符类)之外,则不需要在正则表达式中转义,即[...].


根据下面的评论,OP 的意图似乎是删除所有*.sql以 2 个连字符开头的文件中的注释部分。

你可以用这个sed

sed -i 's/-- .*//g' *.sql


以上是为什么这个正则表达式在grep中有效但在sed中无效?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>