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