【问题标题】:Why does this regex work in grep but not sed?为什么这个正则表达式在 grep 中有效,但在 sed 中无效?
【发布时间】:2021-02-26 19:41:17
【问题描述】:

我有两个正则表达式:

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

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

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

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

(如果你不熟悉这种类型的MySql cmets,sql cmets后面两个连字符后面的空格是必须的)

【问题讨论】:

  • grep regex 的大致等价物是 sed -n /regex/psed /regex/!dsed 命令的语法无效。

标签: regex sed grep


【解决方案1】:

您正在尝试使用:

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

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

应该是:

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

等价的grep 将是:

grep -- '-- ' *.sql

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

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

使用-- 分隔grep 命令中的模式和参数。

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


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

您可以为此使用sed

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

【讨论】:

  • 如问题中所述,我正在尝试从 sql 文件中删除注释。那么我不需要从注释的开头选择到行尾($)吗?或者它只会删除两个连字符
  • 在这种情况下使用sed 's/-- .*//' file.sql
  • 最终使用$ sed -i 's/-- .*//g' *.sql 完成它,感谢内部正则表达式的帮助。
  • @Daniel Re. “如问题所述”;您本可以更清楚地表明您并不期望 sed 做与 grep 相同的事情;您的标题说“grep 有效,sed 无效”。四个人(3 个答案,1 条评论)独立思考同样的事情并以非常相似的方式回答这一事实似乎使这一点相当明显......
  • @tink 是的,回头看似乎有点被动攻击,但我不是故意让它听起来像那样。我只是想在我的评论中引用这个问题,结果很糟糕。我同意这个问题本来可以更清楚。
【解决方案2】:

这里的问题不是正则表达式,问题是sed 需要一个命令。相当于您的grep 将是:

 sed -n  '/\-\- .*$/p' 

您抑制不匹配行的输出 -n ...您 搜索 (将您的正则表达式包装在斜杠中)并且您 print p (在最后一个之后斜线)。

P.S.:正如 Anub 指出的,在正则表达式中转义连字符 - 是不必要的。

【讨论】:

    【解决方案3】:

    您正在尝试使用 sed<strong>\c</strong><em>regexp</em><strong>c</strong> 语法,其中 \-&lt;...&gt; 您告诉 sed 您要使用的分隔符 character 是破折号 -,但您没有'不要终止它应该在的地方:\-&lt;...&gt;- 还添加 d 命令来删除这些行。

    sed '\-\-\-.*$-d' infile
    

    请参阅man sed

    \c正则表达式c 匹配匹配正则表达式 regexp 的行。 c 可以是任何字符。

    如果使用默认 /,则不需要,因此:

    sed '/--.*$/d' infile
    

    或者简单地说:

    sed '/^--/d' infile
    

    更准确地说:

    sed '/^[[:blank:]]*--/d' infile
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2012-11-05
      • 2015-07-08
      • 2019-06-09
      相关资源
      最近更新 更多