2012-05-10 34 views
9

Estoy teniendo un problema con grep que parece que no puedo entender. Intento buscar todas las instancias de palabras minúsculas entre comillas dobles (cadenas C) en un conjunto de archivos fuente. El uso de bash y GNU grep:Patrón de Grep que coincide con la cadena de minúsculas entre comillas dobles

grep -e '"[a-z]+"' *.cpp 

me da ninguna coincidencia, mientras

grep -e '"[a-z]*"' *.cpp 

me da Partidos como "ABC", que no son sólo los caracteres en minúscula. ¿Cuál es la expresión regular adecuada para que coincida solo con "abc"?

+0

Su segunda expresión regular se ve bien. Lo intenté y no coincide con los caracteres en mayúscula. – Misha

+1

@Mike está olvidando el orden de clasificación específico de la configuración regional. –

+0

@Don ¡Gracias, ni siquiera pensé en eso! – Misha

Respuesta

8

Se olvida de escapar de la metacaracteres

grep -e '"[a-z]\+"' 

Para la segunda parte, la razón por la que se está combinando caracteres de varias cajas se debe a su configuración regional. En la siguiente manera:

$ echo '"Abc"' | grep -e '"[a-z]\+"' 
"Abc" 
$ export LC_ALL=C 
$ echo '"Abc"' | grep -e '"[a-z]\+"' 
$ 

para obtener el comportamiento "ascii-like", es necesario establecer la configuración regional de "C", tal como se especifica en la página man grep:

Dentro de una expresión entre corchetes, una expresión de rango consta de dos caracteres separados por un guión. Coincide con cualquier carácter único que ordene entre los dos caracteres, inclusive, utilizando la secuencia de clasificación y el juego de caracteres de la configuración regional. Por ejemplo, en la configuración regional C predeterminada , [a-d] es equivalente a [abcd]. Muchos entornos locales ordenan los caracteres en el orden de los diccionarios, y en estas configuraciones regionales [a-d] es que generalmente no es equivalente a [abcd]; podría ser equivalente a [aBbCcDd], por ejemplo. Para obtener la interpretación tradicional de expresiones con corchetes, puede utilizar la configuración regional C estableciendo la variable de entorno LC_ALL al valor C.

+0

Sí, estúpidos locales. Además, ¿por qué tengo que escapar del +? Pensaría que si quisiera un literal + me escaparía y que un + desnudo sería considerado el metacarácter. –

+1

En las expresiones regulares básicas, los metacaracteres?, +, {, |, (, Y) pierden su significado especial; en su lugar, use las versiones invertidas \? \ +, \ {, \ |, \ (y \). Para obtener expresiones regulares extendidas, use -E –

+0

-E, gracias. Los viejos hábitos tardan en morir. –

1

enmascarar el +

grep -e '"[a-z]\+"' *.cpp 

o utilizar egrep:

egrep '"[a-z]+"' *.cpp 

tal vez usted tuvo en cuenta -E:

grep -E '"[a-z]+"' *.cpp 

La -e minúsculas se utiliza, por ejemplo, para especificar múltiples patrones de búsqueda.

El phaenomenon de caracteres en mayúscula podría origen de su localidad - que se puede prevenir con:

LC_ALL=C egrep '"[a-z]+"' *.cpp 
+0

Pensé que grep -e era egrep. Creo que estaba equivocado. –

+0

Sí, yo también pensé, pero como mi hábito es usar egrep, probé egrep sin mirar más de cerca la opción -e, y justo después de tener éxito con egrep, me di cuenta de que el -e debería hacer algo similar- pensé lo mismo. Pero la opción correcta es -E, con mayúscula E. Busque en la página de manual. –

0

es probable que necesite para escapar de la +:

grep -e '"[a-z]\+"' *.cpp 
0

Si no desea ensuciar alrededor con lugares, esto funcionó para mí:

grep -e '"[[:lower:]]\+"' 
Cuestiones relacionadas