2011-01-29 201 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描述它使用的语法。