我有两个正则表达式:
$ grep -E '\-\- .*$' *.sql
$ sed -E '\-\- .*$' *.sql
(我试图在 sql 文件中有注释的行进行 grep 并删除有注释的 sql 文件中的行)
grep 命令使用这个正则表达式;但是,sed 返回以下错误:
sed: -e expression #1, char 7: unterminated address regex
我在使用 sed 时做错了什么?
(如果你不熟悉这种类型的MySql注释,sql注释需要两个连字符后的空格)
答案 0 :(得分:5)
您正在尝试使用:
sed -E '\-\- .*$' *.sql
此处的 sed
命令不正确,因为您并没有真正告诉 sed
做某事。
应该是:
sed -n '/-- /p' *.sql
和等效的 grep
将是:
grep -- '-- ' *.sql
甚至更好的固定字符串搜索:
grep -F -- '-- ' *.sql
在 --
命令中使用 grep
分隔模式和参数。
如果 -
在括号表达式(或字符类)之外,即 [...]
,则无需在正则表达式中转义。
根据下面的评论,OP 的意图似乎是删除所有以 2 个连字符开头的 *.sql
文件中的注释部分。
您可以使用此 sed
:
sed -i 's/-- .*//g' *.sql
答案 1 :(得分:3)
这里的问题不是正则表达式,问题是 sed
需要一个命令。相当于您的 grep
将是:
sed -n '/\-\- .*$/p'
您抑制不匹配行 -n
的输出...您搜索(用斜杠包裹您的正则表达式)然后您打印 p
(在最后一个斜杠之后)。
P.S.:正如 Anub 指出的,在正则表达式中转义连字符 -
是不必要的。
答案 2 :(得分:2)
您正在尝试使用 sed 的 \cregexpc
语法,其中使用 \-<...>
您是在告诉 sed 您想要使用的分隔符 c
字符是破折号 { {1}},但您没有在应有的位置终止它:-
还添加 \-<...>-
命令以删除这些行。
d
参见sed '\-\-\-.*$-d' infile
:
\c正则表达式c 匹配与正则表达式 regexp 匹配的行。 c 可以是任何字符。
如果使用默认 man sed
,则不需要,因此:
/
或者简单地说:
sed '/--.*$/d' infile
更准确地说:
sed '/^--/d' infile