我需要在我的 sql 脚本(即 Oracle 外连接表达式)中找到“(+)”的出现。意识到“+”、“(”和“)”都是特殊的正则表达式字符,我尝试了:
grep "\(\+\)" *
现在这确实会返回出现的“(+)”,但也会返回其他行。 (似乎任何在同一行上有开括号和闭括号的东西。)回想一下,parens 只对扩展 grep 有特殊意义,我试过:
grep "(\+)" * grep "(\\+)" *
这两个都只返回包含“()”的行。所以假设“+”无法转义,我尝试了一个老把戏:
grep "([+])" *
行得通。我使用非正则表达式工具交叉检查了结果。
问题:有人可以解释一下“+”字符到底是怎么回事吗?有没有更简单的方法来匹配“(+)”?
(我正在使用 cygwin grep 命令。)
编辑:感谢您提供解决方案。 -- 现在我看到,根据 Bruno 引用的 GNU grep 手册,“\+
”在 basic 表达式中使用时会给出“+”它的扩展 意思,因此匹配一个或多个“(”后跟一个“)”。在我的文件中,它始终是“()”。
最佳答案
GNU grep(包含在 Cygwin 中)支持正则表达式的两种语法:基本语法和扩展语法。 grep
使用基本正则表达式,egrep
或 grep -E
使用扩展正则表达式。基本区别,来自grep manual , 如下:
In basic regular expressions the metacharacters
?
,+
,{
,|
,(
, and)
lose their special meaning; instead use the backslashed versions\?
,\+
,\{
,\|
,\(
, and\)
.
由于你想要字符(
+
)
的普通意义,以下两种形式之一应该为您的目的工作:
grep "(+)" * # Basic
egrep "\(\+\)" * # Extended
关于regex - grep:匹配文字 "+",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/188787/