2012-04-13 8 views
11

Ich verwende die folgende grep Abfrage, um das Vorkommen von Funktionen in einer VB-Quelldatei zu finden.Wie grep um ein optionales Wort einzuschließen?

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

Das passt -

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

jedoch verfehlt es auf Funktionen aus wie -

Private Static Sub SaveCustomer() 

wegen des zusätzlichen Wort "Static" drin. Wie wird dieses "optionale" Wort in der grep-Abfrage berücksichtigt?

Antwort

12

Sie einen \? verwenden können optional etwas zu machen:

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

In diesem Fall wird die vorhergehende Gruppe, die die Zeichenkette "statisch", ist optional (d 0 oder 1 mal auftreten können).

+0

Ok. Danke für die Antwort. – CodeBlue

+0

Was ohne den umgekehrten Schrägstrich ein Fragezeichen anzeigen würde? – CodeBlue

+1

@CodeBlue eine wörtliche?. Wenn Sie 'grep' auf diese Weise aufrufen, verwendet es BRE (grundlegende reguläre Ausdrücke). In BRE müssen Sie m maskieren eines der Metazeichen für "erweiterte" Ausdrücke. Wie in einer anderen Antwort angemerkt, wenn Sie -E übergeben hätten, hätten Sie nicht entkommen müssen (in der Tat würde die Flucht es dazu führen, dass es mit einem buchstäblichen Zeichen übereinstimmt!). – FatalError

6

Wenn grep, Mächtigkeit weise:

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

das folgende Beispiel gegeben (wobei die sehr Wort für Ihre statische steht):

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 

Wenn wir nur

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

verwenden wir das '?' (Beachten Sie auch die sorgfältige Platzierung des Raumes nach ‚sehr‘ zu erwähnen, dass wir die ‚sehr‘ Wort Null oder eine Zeit wollen werden:

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

Wie Sie es erraten, lade ich Sie egrep verwenden statt grep (können Sie versuchen, grep -E, für Extended Regular Expressions).

+0

was macht egrep das grep nicht? – CodeBlue

+0

Ich glaube du meinst grep -E mit dem Großbuchstaben E. – CodeBlue

+0

Wie du wahrscheinlich bemerkt hast, erkennt egrep erweiterte reguläre Ausdrücke. Und ich habe meine Antwort behoben. Es ist in der Tat Großbuchstaben, danke. –

Verwandte Themen