2012-04-13 11 views
11

Uso la seguente query di grep per trovare le occorrenze di funzioni in un file di origine VB.Come grep per includere una parola opzionale?

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

Questo corrisponde -

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

Tuttavia, manca su funzioni come -

Private Static Sub SaveCustomer() 

a causa della parola aggiuntiva "Static" in là. Come spiegare questa parola "opzionale" nella query grep?

risposta

12

È possibile utilizzare un \? per fare qualcosa opzionale:

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

In questo caso, il gruppo precedente, che contiene la stringa "statico", è opzionale (cioè può verificarsi 0 o 1 volte).

+0

Ok. Grazie per la risposta. – CodeBlue

+0

Cosa sarebbe un punto di domanda, senza il backslash indica? – CodeBlue

+1

@CodeBlue un letterale?. Quando invochi 'grep' in questo modo, usa BRE (espressioni regolari di base). In BRE, devi sfuggire m uno qualsiasi dei metacaratteri per espressioni "più avanzate". Come notato in un'altra risposta, se tu avessi passato -E allora non avresti dovuto scappare (in effetti, fuggirlo porterebbe ad abbinare un segno letterale!). – FatalError

6

Quando si utilizza grep, cardinalità saggio:

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

Dato il seguente esempio (dove la parola molto si distingue per la vostra statica):

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 

Se vogliamo solo

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

useremo il '?' (Notare anche l'attento posizionamento dello spazio dopo 'molto' di dire che dobbiamo provare la parola 'molto' zero o una volta:

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

Come avete indovinato, vi invito ad usare egrep invece di grep (si può provare grep -E, per le espressioni regolari estese).

+0

cosa fa egrep che grep non lo fa? – CodeBlue

+0

Penso che tu intenda grep -E con la maiuscola E. – CodeBlue

+0

Come probabilmente avrai notato, egrep riconosce le espressioni regolari estese. E ho risolto la mia risposta. È davvero maiuscola E, grazie. –

Problemi correlati