2

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

grep "\(\+\)" *

现在这确实返回了“(+)”的出现,但也返回了其他行。(似乎任何在同一行上带有打开和关闭括号的东西。)回想一下,括号仅对扩展的 grep 是特殊的,我试过:

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

这两个都只返回包含“()”的行。所以假设“+”不能被转义,我尝试了一个老把戏:

grep "([+])" *

这样可行。我使用非正则表达式工具交叉检查了结果。

问题:有人能解释一下“+”字符到底是怎么回事吗?是否有一种不那么笨拙的方式来匹配“(+)”?

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

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

4

2 回答 2

10

GNU grep(包含在 Cygwin 中)支持正则表达式的两种语法:基本和扩展。grep使用基本正则表达式和egrep/或grep -E使用扩展正则表达式。grep 手册中的基本区别如下:

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

由于您想要字符的普通含义,( + )因此以下两种形式中的任何一种都应该适合您的目的:

grep "(+)" *       # Basic
egrep "\(\+\)" *   # Extended
于 2008-10-09T19:33:07.707 回答
1

您可能需要添加一些反斜杠,因为 shell 正在吞噬它们。

ETA:实际上,我刚刚尝试了我的 Cygwin,grep "(+)"似乎可以满足您的需求。

于 2008-10-09T19:23:27.837 回答