Regex grep:literal上的匹配+&引用;

Regex grep:literal上的匹配+&引用;,regex,cygwin,grep,Regex,Cygwin,Grep,我需要在sql脚本中查找“(+)”(即Oracle外部联接表达式)。意识到“+”、“(”和“)”都是特殊的正则表达式字符,我尝试: grep "\(\+\)" * grep "(\+)" * grep "(\\+)" * grep“\(\+\)”* 现在它确实返回了“(+)”的出现,但也返回了其他行。(似乎任何东西的打开和关闭参数都在同一行。)回想起参数仅适用于扩展grep,我尝试: grep "\(\+\)" * grep "(\+)" * grep "(\\+)" * grep“(\+)”*

我需要在sql脚本中查找“(+)”(即Oracle外部联接表达式)。意识到“+”、“(”和“)”都是特殊的正则表达式字符,我尝试:

grep "\(\+\)" * grep "(\+)" * grep "(\\+)" * grep“\(\+\)”* 现在它确实返回了“(+)”的出现,但也返回了其他行。(似乎任何东西的打开和关闭参数都在同一行。)回想起参数仅适用于扩展grep,我尝试:

grep "\(\+\)" * grep "(\+)" * grep "(\\+)" * grep“(\+)”* grep“(\\+)”* 这两个函数都只返回包含“()”的行。所以假设“+”无法逃脱,我尝试了一个老把戏:

grep "([+])" * grep“([+])”* 这很有效。我用非正则表达式工具交叉检查了结果

问题:有人能解释一下“+”字符到底是怎么回事吗?在“(+)”上有没有一种不那么麻烦的匹配方法

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


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

你可能需要添加一些反斜杠,因为外壳正在吞没它们

ETA:事实上,我刚刚在Cygwin上试用过,
grep”(+)“
似乎可以满足您的需要。

grep使用基本正则表达式,而
egrep
grep-E
使用扩展正则表达式。与标准的基本区别如下:

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

由于您需要字符
+
的普通含义,因此以下两种形式中的任何一种都适用于您的目的:

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

我刚刚试过grep-E“(\+)”*,效果很好。所以这似乎不是一个shell问题。cygwin非扩展正则表达式会被破坏吗?太糟糕了,只能接受一个答案。Bruno带我看了一遍,但你也是对的。我忘记了“+”也只适用于扩展正则表达式。不,那些字符在双引号字符串中应该很好。我刚刚发现你的第二个示例有效,而不是第一个。嗯。cygwin grep被破坏了吗?grep--version的输出是什么?对我来说,它适用于“grep(GNU grep)2.5.1”。嗯,这里也一样:grep(GNU grep)2.5.1以下不起作用?echo-e“(+)\n()\n+”| grep“(+)“啊,这很有效!(我不知道你在前面掉了“+”),所以duh,“+”也是一个扩展正则表达式。我固执地认为是一个基本正则表达式。谢谢。