为什么这个正则表达式在grep中有效但在sed中无效?
我有两个正则表达式:
$ grep -E '-- .*$' *.sql$ 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