2011-01-29 16 views
12

Ho notato per un po 'che, su alcuni dei sistemi basati su Unix che uso almeno, ls [A-Z]* mi ha dato i risultati che avrei anticipato dal ls [A-Za-z]*, lasciandomi in grado di ottenere facilmente un elenco di solo i maledetti file che iniziano con lettere maiuscole. Ora mi sono imbattuto nella stessa cosa con grep, in cui non riuscivo a smettere di abbinare le lettere minuscole con [A-Z] fino a quando non ho usato lo grep -P per ottenere un'espressione regolare Perl.Che succede con [A-Z] che significa [A-Za-z]?

Così ho alcune domande relative:

  1. Quando è iniziato questo idiozia?
  2. Chi è responsabile e deve essere punito?
  3. PERCHÉ ???
  4. Esiste qualche soluzione ragionevolmente semplice per uno o entrambi i casi ls e grep? (Cercando, ad esempio, grep --no-ignore-case era inutile. grep -P non è una buona soluzione a causa del suo status di sperimentale caratteristica.)
+1

'[[: upper:]]' è un'altra opzione. – wnoise

+0

Ah, grazie. Ho una specie di allergia a quei costrutti e non li penso mai. – chaos

+0

Si è imbattuto in questo mentre cercavo qualcosa di diverso, e facendo a mano a mano che le tue domande correlate mi hanno bloccato. :-) – KSwift87

risposta

15

In realtà è [A-Za-y], e ha a che fare con le regole di confronto della lingua. Se si desidera eseguire l'override, impostare $LC_COLLATE in modo appropriato; uno di C o POSIX dovrebbe fare.

+0

Oh, grazie grazie. '[A-Za-y]'? Sono terrorizzato di chiedere, ma perché 'y' e non' z'? – chaos

+0

Perché 'Z' è prima di' z' nell'ordine di confronto. –

+3

A destra, in queste locali interrotte '[A-Z]' si trasforma in '[AaBbCcDd .... YyZ]' – wnoise

3

Dipende dalle impostazioni locali. Se si desidera che lo [A..Z] corrisponda solo alle maiuscole, è possibile utilizzare le impostazioni internazionali C: impostare LC_COLLATE o LC_ALL a C.

LC_ALL=C 
ls [A..Z]* 

bash manual, pattern matching

+1

Ma poi, l'IMO al ribasso di questo è che quando si 'ls', si ottengono prima tutti i file maiuscoli e poi tutti i minuscoli ... e di conseguenza, la maggior parte delle volte, si deve cercare in due posti per un file che non ricordi se inizia con lettere maiuscole o minuscole.;-) –

-1

shell Unix in realtà non usare le espressioni regolari, ma modelli glob, che sono nettamente diverso da espressioni regolari. Una differenza è che sono implicitamente ancorati all'inizio e alla fine della stringa - ad es. ls foo[a-z] elencherà il file food, ma non fooble. Non è in realtà ls facendo l'abbinamento qui, ma la shell stessa. I globi sono anche di solito a volte senza custodia (a seconda dell'implementazione).

Dai un'occhiata alla pagina di manuale per la tua shell interattiva preferita e leggi la corrispondenza globale - ad esempio bash's manpage about filename expansion descrive la sintassi che usa.

+1

Hai ragione che la shell usa i glob anziché le espressioni regolari, ma i glob sono sensibili al maiuscolo/minuscolo. – wnoise

+0

@wnoise: hmm, penso che quella parte sia dipendente dall'implementazione; Farò più ricerche. – Ether