Regex grep:literal上的匹配+&引用;
我需要在sql脚本中查找“(+)”(即Oracle外部联接表达式)。意识到“+”、“(”和“)”都是特殊的正则表达式字符,我尝试: grep "\(\+\)" * grep "(\+)" * grep "(\\+)" * grep“\(\+\)”* 现在它确实返回了“(+)”的出现,但也返回了其他行。(似乎任何东西的打开和关闭参数都在同一行。)回想起参数仅适用于扩展grep,我尝试: grep "\(\+\)" * grep "(\+)" * grep "(\\+)" * grep“(\+)”* grep“(\\+)”* 这两个函数都只返回包含“()”的行。所以假设“+”无法逃脱,我尝试了一个老把戏: grep "([+])" * grep“([+])”* 这很有效。我用非正则表达式工具交叉检查了结果 问题:有人能解释一下“+”字符到底是怎么回事吗?在“(+)”上有没有一种不那么麻烦的匹配方法 (我正在使用cygwin grep命令。)Regex grep:literal上的匹配+&引用;,regex,cygwin,grep,Regex,Cygwin,Grep,我需要在sql脚本中查找“(+)”(即Oracle外部联接表达式)。意识到“+”、“(”和“)”都是特殊的正则表达式字符,我尝试: grep "\(\+\)" * grep "(\+)" * grep "(\\+)" * grep“\(\+\)”* 现在它确实返回了“(+)”的出现,但也返回了其他行。(似乎任何东西的打开和关闭参数都在同一行。)回想起参数仅适用于扩展grep,我尝试: grep "\(\+\)" * grep "(\+)" * grep "(\\+)" * 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,“+”也是一个扩展正则表达式。我固执地认为是一个基本正则表达式。谢谢。