2012-04-13 29 views
11

次のgrepクエリを使用して、VBソースファイル内の関数の出現を検索します。オプションの単語を含めるにはどうすればよいですか?

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

これは一致した - なぜならそこに追加の単語 "静的" の

Private Static Sub SaveCustomer() 

-

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

をしかし、それはのような関数に出ミス。 grepクエリでこの「オプションの」単語をどのように説明するのですか?

答えて

12

オプションのものにするために\?を使用することができます。この場合

​​

を、「静的」の文字列が含まれている先行グループは、(すなわち、0または1回発生する可能性)オプションです。

+0

[OK]をクリックします。答えてくれてありがとう。 – CodeBlue

+0

バックスラッシュを付けずに疑問符なるかを示している? – CodeBlue

+1

@CodeBlueリテラル?。この方法で 'grep'を呼び出すと、BRE(基本正規表現)が使用されます.BREでは、mをエスケープする必要があります「より高度な」表現のためのメタキャラクタのいずれか。別の答えに書かれているように、あなたが-Eを通過していれば、それをエスケープする必要はありませんでした(実際にはエスケープするとリテラルにマッチするでしょう)。 – FatalError

6

賢明grepを、カーディナリティ使用:我々は唯一の

をしたい場合は

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 

:(非常に言葉があなたの静的の略)次の例を考えると

* : 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 

では '?'を使用しますあなたはそれを推測したように、私はのegrepを使用するためにあなたを招待しています

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

:(また、私たちは「非常に」言葉をお勧めしますことを言及するには「非常」の後にゼロまたは1回のスペースを慎重に配置することを気づきます代わりにのgrep(あなたが拡張正規表現のために、のgrep -Eを試すことができます)。

+0

egrepはgrepに何をしていないのですか? – CodeBlue

+0

grep -Eと大文字のE.を意味すると思います。 – CodeBlue

+0

おそらく気づいたように、egrepは拡張正規表現を認識します。私は答えを決めました。本当にありがとう、大文字のEです。 –

関連する問題