2011-01-11 1 views

答えて

0

あなたが正規表現でのlsとgrepの組み合わせを使用することができます。bashで

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

を:

$ 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 

これらはあなたがまた、ループでそれらを使用することができますshell expansionsあるので、比較的簡単に。

LC_ALL=C設定 - あなたは英語以外のロケールを使用している場合、それは正しい結果を生成するために必要となる場合があります。

$ 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 

あなたの代わりに、より具体的なLC_COLLATE変数を設定することができ、上記のサンプルで見られるようにLC_ALLです。

EDIT:ところで

は、少なくとも私のシステム(MandrivaのLinuxの2010.1)に、ロケールもgrep影響:私はないと思う

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

任意のロケール(まだ使用中) '* [bd-z] 'は異なってマッチします。確かにUTF-8ロケールではありません。 – ephemient

+0

@ephemient:例の私の編集を参照してください – thkala

+0

まあ、そうです。 'fnmatch'は照合を範囲に適用しますが、' [x] 'は単一の文字ではありません。それはバグのようです。 – ephemient

関連する問題