我需要在我的sql脚本中找到“(+)”的出现位置(即Oracle外连接表达式)。意识到“+”,“(”和“)”都是特殊的正则表达式字符,我试过:
grep "\(\+\)" *
现在这确实会返回“(+)”的出现,但也会返回其他行。 (看起来在同一条线上有任何开放和关闭的parens。)回想说parens只适用于扩展grep,我试过:
grep "(\+)" * grep "(\\+)" *
这两个都只返回包含“()”的行。因此,假设“+”无法转义,我尝试了一个老技巧:
grep "([+])" *
有效。我使用非正则表达式工具交叉检查结果。
问题:有人可以用“+”字符解释究竟发生了什么吗?在“(+)”上是否有较少的克服方式?
(我正在使用cygwin grep命令。)
编辑:感谢您的解决方案。 - 现在我看到,根据Bruno引用的GNU grep手册,“\+
”在 basic 表达式中使用时会给出“+”其扩展含义,因此匹配一个或多个“(”s后跟一个“)”。在我的文件中总是“()”。
答案 0 :(得分:10)
GNU grep(包含在Cygwin中)支持两种正则表达式语法:basic和extended。 grep
使用基本正则表达式,egrep
或grep -E
使用扩展正则表达式。 grep manual的基本区别如下:
在基本正则表达式中,元字符
?
,+
,{
,|
,(
和)
失去了它们的特殊含义;而是使用反斜杠版本\?
,\+
,\{
,\|
,\(
和\)
。
由于您需要字符(
+
)
的普通含义,因此以下两种表单中的任何一种都可以用于您的目的:
grep "(+)" * # Basic
egrep "\(\+\)" * # Extended
答案 1 :(得分:1)
你可能需要添加一些反斜杠,因为shell会吞下它们。
ETA:实际上,我只是尝试过我的Cygwin,grep "(+)"
似乎可以正常工作。