2008-10-09 234 views
2

我需要在我的sql腳本(即Oracle外部連接表達式)中查找「(+)」的出現次數。認識到「+」,「(」和「)」都是特殊字符的正則表達式,我想:grep:匹配文字「+」

 
grep "\(\+\)" * 

現在這並返回「(+)」,但其他線路出現爲好。 (與在同一行中打開和關閉括號看似什麼)回顧括號僅用於擴展的grep特殊,我想:

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

包含這些只返回行的兩個「()」。因此,假設「+」無法逃脫,我嘗試過的老把戲:

 
grep "([+])" * 

工程。我用非正則表達式工具交叉檢查結果。

問題:有人可以解釋「+」字符到底是怎麼回事嗎?在「(+)」上匹配的方式有多少?

(我用cygwin的grep命令。)

編輯:謝謝你的解決方案。 - 現在我看到,根據Bruno提到的GNU grep手冊,「\+」當用於基本的表達式時,它給出了「+」其擴展的含義,因此匹配一個或多個「(」s之後是「)」。並且在我的文件中總是「()」。

回答

10

GNU grep(包含在Cygwin中)支持正則表達式的兩種語法:basic和extended。 grep使用基本正則表達式,egrepgrep -E使用擴展正則表達式。最根本的區別,從grep manual,如下:

在基本的正則表達式的元字符?+{|()失去了特殊的意義;改爲使用反斜槓版本\?,\+,\{,\|,\(\)

既然你想要的字符(+),無論是以下兩種形式應該爲你的目的而工作的普通含義

grep "(+)" *  # Basic 
egrep "\(\+\)" * # Extended 
1

您可能需要添加一些反斜槓,因爲shell正在吞嚥它們。

ETA:其實,我只是嘗試了我的Cygwin,並且grep "(+)"似乎對你想要的很好。

+0

我只是想的grep -E「\(\ + \)「*,這是有效的。所以這似乎不是一個殼問題。 cygwin的非擴展正則表達式可能會被打破嗎? – 2008-10-09 19:30:50

+0

太糟糕了,只有一個答案可以接受。布魯諾通過它走過我,但你也是對的。我忘記了「+」也僅適用於擴展正則表達式。 – 2008-10-09 19:50:09