2012-06-23 12 views
13

no puedo conseguir grep a mayúsculas y minúsculas búsqueda con este patróngrep case sensitive [A-Z]?

$ grep 'T[A-Z]' test.txt 
The Quick Brown Fox Jumps Over The Lazy Dog 
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 
+0

Esto parece ser un error en al menos algunas versiones de 'grep'; cuando usa un rango de letras en su expresión regular, la búsqueda en caso de que sea insensible para todas las letras, pero la primera en el rango. P.ej. 'echo 's' | grep '[S-T]' 'no genera ninguna salida, mientras que' echo 't' | grep '[S-T]' 'saca' t'. Por otro lado, 'echo 't' | grep -o '[S-T]' 'tampoco da salida, lo cual es algo confuso. Usar '[[: upper:]]' en su lugar parece resolver este problema para el caso cuando el rango es '[A-Z]'. – HelloGoodbye

Respuesta

7

usar comillas para evitar que el patrón de ser emparejado como un pegote para archivo (s) en el sistema de archivos por el shell. ''

Utilice una clase de caracteres nombrada para garantizar una coincidencia que distinga entre mayúsculas y minúsculas. [[:lower:]]

Use un cuantificador para hacer coincidencias con más de un carácter. \+

Utilice ancla (s) para asegurarse de que la cerilla esté colocada correctamente. ^

grep '^T[[:upper:]]\+' test.txt 

La razón de que [A-Z] no funciona para usted es que la forma en la configuración regional que está utilizando se implementa en el sistema, que también incluye patrón de letras minúsculas.

+1

@svnpenn: Ver [this] (http://unix.stackexchange.com/questions/15980/does-should-lc-collate-affect-character-ranges) y [this] (http: //unix.stackexchange. com/questions/19322/why-are-capital-letters-included-in-a-range-of-min-case-letters-in-an-awk-rege) para una discusión de los problemas. –

5

Puede establecer el valor de LANG:

$ LANG=C grep 'T[A-Z]' test.txt 
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 
1
grep 'T[[:upper:]]' test.txt 
grep 'T[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' test.txt