2012-04-13 9 views
11

Utilizo la siguiente consulta grep para encontrar las ocurrencias de funciones en un archivo fuente VB.¿Cómo grep para incluir una palabra opcional?

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

Esto coincide -

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

Sin embargo, no tiene en cuenta las funciones como -

Private Static Sub SaveCustomer() 

a causa de la palabra adicional "estático" en ese país. ¿Cómo contabilizar esta palabra "opcional" en la consulta grep?

Respuesta

12

Puede utilizar un \? hacer algo opcional:

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

En este caso, el grupo precedente, que contiene la cadena "estática", es opcional (es decir, puede ocurrir 0 o 1 veces).

+0

Ok. Gracias por la solución. – CodeBlue

+0

¿Cómo sería un signo de interrogación sin la barra invertida indicar? – CodeBlue

+1

@CodeBlue un literal?. Cuando invocas 'grep' de esta forma, usa BRE (expresiones regulares básicas). En BRE, necesitas escapar m cualquiera de los metacaracteres para expresiones "más avanzadas". Como se señaló en otra respuesta, si hubiera pasado -E, entonces no habría tenido que escapar de ella (de hecho, si escaparía, ¡coincidiría con una marca literal!). – FatalError

6

Al usar grep, cardinalidad sabia:

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

Teniendo en cuenta el ejemplo siguiente (donde la palabra muy se refiere a su estática):

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 

Si sólo queremos

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

usaremos el '?' (También notar la colocación cuidadosa del espacio después de 'muy' hablar de que vamos a querer la palabra 'muy' cero o una vez:

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

Como has adivinado, estoy invitando a utilizar egrep en lugar de grep (puedes probar grep -E, de las expresiones regulares extendidas).

+0

¿qué hace egrep que grep no tiene? – CodeBlue

+0

Creo que se refería a grep -E con la letra mayúscula E. – CodeBlue

+0

Como probablemente haya notado, egrep reconoce expresiones regulares extendidas. Y arreglé mi respuesta. Es mayúscula E, de hecho, gracias. –

Cuestiones relacionadas