2011-01-29 202 views
12

我注意到了一段時間,現在,在一些基於Unix的系統我用至少,ls [A-Z]*一直給我的結果我就從ls [A-Za-z]*預期,使我無法輕易得到的只是該死的列表以大寫字母開頭的文件。我剛纔碰到了同樣的事情grep,在這裏我不能讓它停止與[A-Z]匹配小寫字母,直到我最終用grep -P得到Perl的正則表達式。什麼是[A-Z]含義[A-Za-z]?

所以我有一些相關的問題:

  1. 從什麼時候開始白癡?
  2. 誰負責,需要處罰?
  3. WHY ???
  4. 對於lsgrep個案中的任何一個或兩個案例,是否有一些相當簡單的解決方法? (嘗試,例如,grep --no-ignore-case是徒勞的。grep -P是不是一個很好的解決辦法,因爲它的實驗性功能狀態。)
+1

`[[:upper:]]`是另一種選擇。 – wnoise 2011-01-29 00:54:01

+0

啊,謝謝。我對這些結構有些過敏,從來沒有想過它們。 – chaos 2011-01-29 00:54:52

+0

在尋找不同的東西的時候偶然發現了這個問題,並且因爲你的相關問題讓我失望而加註。 :-) – KSwift87 2013-01-04 20:19:05

回答

15

它實際上[A-Za-y],以及它與語言的排序規則來做。如果您想覆蓋它,則適當地設置$LC_COLLATE;應該做CPOSIX

+0

哦,謝謝你,謝謝。 `[A-ZA-Y]`?我很害怕問,但爲什麼``而不是`z`? – chaos 2011-01-29 00:48:58

3

這取決於您的語言環境。如果你想有[A..Z]只匹配大寫字母,你可以使用C語言環境:設置LC_COLLATELC_ALLC

LC_ALL=C 
ls [A..Z]* 

bash manual, pattern matching

-1

Unix外殼不實際使用正則表達式,但glob模式,這是從正則表達式明顯不同。一個區別是它們隱含地錨定在字符串的開始和結尾 - 例如ls foo[a-z]將列出文件food,但不包括fooble。實際上並不是ls在這裏進行匹配,而是殼本身。 Globes也 通常 有時不區分大小寫(取決於實施)。

看看手冊頁爲您最喜愛交互shell和閱讀有關的glob匹配 - 例如bash's manpage about filename expansion描述它使用的語法。