2011-01-29 7 views
12

私は、少なくとも使用するUNIXベースのシステムの一部に、ls [A-Z]*は、私がls [A-Za-z]*から予想するだろうな結果を与えるだけで簡単にgoddamnedのリストを取得することができない私を残してきた今、ことをしばらくの間、気づきましたファイルは大文字で始まります。私はちょうど今、私は最終的にはPerlの正規表現を取得するためにgrep -Pを使用するまで、私はそれが[A-Z]と小文字を一致停止することができませんでしたgrep、と同じことに走りました。[A-Z]は[A-Za-z]を意味しますか?

だから私はいくつかの関連の質問があります:この白痴が始めたの

  1. を?
  2. 誰が責任を負い、罰せられる必要がありますか?
  3. WHY?
  4. lsgrepのいずれか、または両方のケースで、適切な回避策がありますか? (しようと、例えば、grep --no-ignore-caseは無益だった。grep -Pは、その実験的な機能の状態の非常に良い回避策はありません。)
+1

'[[:upper:]]'は別のオプションです。 – wnoise

+0

ああ、ありがとう。私はそれらの構造物にある種のアレルギーを持っていて、それらを考えません。 – chaos

+0

何か違うものを探していて、あなたの関連する質問が私をひどくひっくり返してしまったので、これを見つけました。 :-) – KSwift87

答えて

15

それは実際に[A-Za-y]だし、それは言語の照合順序に関係しています。上書きする場合は、$LC_COLLATEを適切に設定します。 CまたはPOSIXのいずれかを指定する必要があります。

+0

ああ、ありがとう、ありがとう。 '[A-Za-y]'?私は尋ねるのが恐ろしいですが、なぜ「y」ではなく「z」であるのですか? – chaos

+0

照合順序で 'Z'が' z'の前にあるためです。 –

+3

これらの壊れたロケールで右、 '[A-Z]は' '[AABBCCDD .... YYZ]' – wnoise

3

あなたの地域によって異なります。あなたは[A..Z]のみ大文字と一致していることをしたい場合は、Cロケールを使用することができます。CLC_COLLATEまたはLC_ALLを設定します。正規表現とは明らかに異なっている

LC_ALL=C 
ls [A..Z]* 

bash manual, pattern matching

+1

しかし、これの下側のIMOは、あなたが 'ls'をするときに大文字のファイルを最初に取得し、次にすべて小文字で取得します。その結果、ほとんどの場合、2つの場所を調べなければなりませんあなたが大文字か小文字かで始まるかどうかを覚えていないファイル。;-) –

-1

Unixシェルが実際に正規表現を使用していませんが、globパターン、。 1つの違いは、文字列の先頭と末尾に暗黙的に固定されている点です。 ls foo[a-z]にはファイルfoodが表示されますが、foobleは表示されません。実際には一致するのはlsではなく、シェル自体です。グロブも です。 時々大文字と小文字を区別しません(実装によって異なります)。

お気に入りのインタラクティブシェルのmanページを見て、グロブマッチングについて読ん - 例えばbash's manpage about filename expansionは、それが使用する構文について説明します。

+1

シェルはregexpsではなくglobを使用しますが、globは大文字と小文字を区別します。 – wnoise

+0

@wnoise:うーん、私はその部分が実装依存だと思う。私はもっ​​と研究をします。 – Ether