2012-06-23 17 views
13

Non riesco grep a maiuscole e minuscole di ricerca con questo modellogrep 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

Questo sembra essere un bug in almeno alcune versioni di 'grep'; quando si utilizza un intervallo di lettere nella propria espressione regolare, la ricerca è insensibile a tutte le lettere tranne la prima dell'intervallo. Per esempio. 'echo 's' | grep '[S-T]' 'non genera alcun output, mentre 'echo' t '| grep '[S-T]' 'output' t'. D'altra parte, 'echo' t '| grep -o '[S-T]' 'non produce nulla, il che è un po 'confuso. Usare '[[: upper:]]' sembra invece risolvere questo problema per il caso quando l'intervallo è '[A-Z]'. – HelloGoodbye

risposta

7

utilizzare le virgolette per evitare che il modello da cui ci si allinea come glob per file (s) nel filesystem dalla shell. ''

Utilizzare una classe di caratteri con nome per garantire una corrispondenza con distinzione tra maiuscole e minuscole. [[:lower:]]

Utilizzare un quantificatore per creare corrispondenze per più di un carattere. \+

Utilizzare gli ancoraggi per assicurarsi che la corrispondenza sia posizionata correttamente. ^

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

La ragione per cui [A-Z] non funziona per voi è che il modo in cui il locale si sta utilizzando è implementata sul sistema, quel modello include anche le lettere minuscole.

+1

@svnpenn: vedere [this] (http://unix.stackexchange.com/questions/15980/does-should-lc-collate-affect-character-ranges) e [this] (http: //unix.stackexchange. it/questions/19322/why-is-capital-letters-included-in-a-range-of-lower-case-letters-in-an-awk-rege) per una discussione dei problemi. –

5

È possibile impostare il valore 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 
Problemi correlati