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

时间:2021-02-26 19:41:17

标签: regex sed grep

我有两个正则表达式:

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

(我试图在 sql 文件中有注释的行进行 grep 并删除有注释的 sql 文件中的行)

grep 命令使用这个正则表达式;但是,sed 返回以下错误:
sed: -e expression #1, char 7: unterminated address regex

我在使用 sed 时做错了什么?

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

3 个答案:

答案 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