2011-01-11 14 views

Antwort

0

Sie eine Kombination von ls und grep mit regulären Ausdrücken verwenden können:

ls | grep -e "[bd-z]$" 
3

Auf bash:

$ LC_ALL=C 
$ ls 
bar BAT cab foo ieee2000 MAC moc test zac zara ZOO 
$ ls *[a-z] 
bar cab foo moc test zac zara 
$ ls *[bd-z] 
bar cab foo test 
$ ls *[^cC] 
bar BAT cab foo ieee2000 test zara ZOO 
$ ls *[^bc] 
bar BAT foo ieee2000 MAC test zara ZOO 

Da diese shell expansions sind, können Sie diese auch in Schleifen verwenden usw. relativ leicht.

Notiere die LC_ALL=C Einstellung - wenn Sie eine nicht-englischen Gebietsschema verwenden es erforderlich sein, um möglicherweise korrekte Ergebnisse zu produzieren:

$ echo $LC_COLLATE 
en_US.UTF-8 
$ ls *[a-z] 
bar BAT cab foo MAC moc test zac zara ZOO 
$ LC_COLLATE=C 
$ ls *[a-z] 
bar cab foo moc test zac zara 

Wie in der Probe gesehen oberhalb Sie die speziellere LC_COLLATE Variable kann stattdessen von LC_ALL.

EDIT:

By the way, zumindest auf meinem System (Mandriva Linux 2010.1), das Gebietsschema wirkt sich auch auf grep:

$ LC_COLLATE=en_US.UTF-8 
$ echo A | grep '[a-z]' 
A 
$ LC_COLLATE=C 
$ echo A | grep '[a-z]' 
$ 
+0

Ich glaube nicht, dass es keine Schauplätze (noch im Einsatz) wo '* [bd-z]' würde anders zusammenpassen. Sicherlich keine UTF-8 Locales. – ephemient

+0

@ephemient: siehe meine Bearbeitung für ein Beispiel – thkala

+0

Hmm, du hast recht. 'fnmatch' wendet die Sortierung auf Bereiche an, aber nicht auf' [x] 'einzelne Zeichen (was mich zu dem oben Gesagten führte). Das scheint ein Fehler zu sein. – ephemient

Verwandte Themen