2012-04-13 47 views
11

我使用以下grep查詢來查找VB源文件中函數的出現次數。如何grep包含一個可選單詞?

grep -nri "^\s*\(public\|private\|protected\)\s*\(sub\|function\)" formName.frm 

此匹配 -

Private Sub Form_Unload(Cancel As Integer) 
    Private Sub lbSelect_Click() 
    ... 

然而,錯過了類似的功能 - 因爲在那裏附加單詞 「靜態」 的

Private Static Sub SaveCustomer() 

。如何解釋grep查詢中的這個「可選」單詞?

回答

12

可以使用\?使一些可選的:

​​

在這種情況下,前面的基團,其包含字符串「靜態」,是可選的(即可能出現0或1次)。

+0

好。感謝您的回答。 – CodeBlue 2012-04-13 14:12:29

+0

什麼會沒有反斜槓問號說明什麼? – CodeBlue 2012-04-13 14:15:44

+1

@CodeBlue文字?當你以這種方式調用'grep'時,它使用BRE(基本正則表達式)。在BRE中,你需要逃脫m任何「更高級」表達式的元字符。正如另一個答案中指出的那樣,如果你已經通過了-E,那麼你就不必逃避它(事實上,逃避它會導致它匹配一個文字標記!)。 – FatalError 2012-04-13 15:26:36

6

當用grep,基數明智:

* : 0 or many 
+ : 1 or many 
? : 0 or 1 <--- this is what you need. 

考慮下面的例子(其中非常字代表你靜態):

I am well 
I was well 
You are well 
You were well 
I am very well 
He is well 
He was well 
She is well 
She was well 
She was very well 

如果我們只希望

I am well 
I was well 
You are well 
You were well 
I am very well 

我們將使用'?' (也注意到空間的精心佈局後「非常」一提的是我們想要的「非常」二字零次或一次:

egrep "(I|You) (am|was|are|were) (very)?well" file.txt 

正如你猜對了,我邀請你使用的egrep的代替grep的(你可以嘗試grep的-E,用於擴展正則表達式)。

+0

egrep做什麼grep不? – CodeBlue 2012-04-13 14:22:51

+0

我認爲你的意思是grep -E,大寫字母E. – CodeBlue 2012-04-13 14:31:34

+0

正如你可能注意到的,egrep可以識別擴展的正則表達式。我確定了我的答案。真是大寫E,謝謝。 – 2012-04-13 15:06:28

相關問題