grep:匹配文字“+”

时间:2008-10-09 19:22:01

标签: regex cygwin grep

我需要在我的sql脚本中找到“(+)”的出现位置(即Oracle外连接表达式)。意识到“+”,“(”和“)”都是特殊的正则表达式字符,我试过:

grep "\(\+\)" *

现在这确实会返回“(+)”的出现,但也会返回其他行。 (看起来在同一条线上有任何开放和关闭的parens。)回想说parens只适用于扩展grep,我试过:

grep "(\+)" *
grep "(\\+)" *

这两个都只返回包含“()”的行。因此,假设“+”无法转义,我尝试了一个老技巧:

grep "([+])" *

有效。我使用非正则表达式工具交叉检查结果。

问题:有人可以用“+”字符解释究竟发生了什么吗?在“(+)”上是否有较少的克服方式?

(我正在使用cygwin grep命令。)

编辑:感谢您的解决方案。 - 现在我看到,根据Bruno引用的GNU grep手册,“\+”在 basic 表达式中使用时会给出“+”其扩展含义,因此匹配一个或多个“(”s后跟一个“)”。在我的文件中总是“()”。

2 个答案:

答案 0 :(得分:10)

GNU grep(包含在Cygwin中)支持两种正则表达式语法:basic和extended。 grep使用基本正则表达式,egrepgrep -E使用扩展正则表达式。 grep manual的基本区别如下:

  

在基本正则表达式中,元字符?+{|()失去了它们的特殊含义;而是使用反斜杠版本\?\+\{\|\(\)

由于您需要字符( + )普通含义,因此以下两种表单中的任何一种都可以用于您的目的:

grep "(+)" *       # Basic
egrep "\(\+\)" *   # Extended

答案 1 :(得分:1)

你可能需要添加一些反斜杠,因为shell会吞下它们。

ETA:实际上,我只是尝试过我的Cygwin,grep "(+)"似乎可以正常工作。