[A-Z]是什么意思[A-Za-z]?

时间:2011-01-29 00:43:55

标签: regex linux shell unix grep

我已经注意到一段时间了,在我至少使用的一些基于Unix的系统上,ls [A-Z]*一直在给我ls [A-Za-z]*预期的结果,让我无法轻松获取以大写字母开头的该死的文件列表。我刚刚与grep发生了同样的事情,在那里我无法让小写字母与[A-Z]匹配,直到我最终使用grep -P来获取Perl正则表达式。

所以我有一些相关的问题:

  1. 这个白痴何时开始?
  2. 谁负责并需要受到惩罚?
  3. WHY ???
  4. 对于lsgrep个案例中的一个或两个,是否有一些相当简单的解决方法? (例如,尝试grep --no-ignore-case没有结果。grep -P由于其实验性功能状态而不是一个非常好的解决方法。)

3 个答案:

答案 0 :(得分:15)

实际上是[A-Za-y],它与语言整理有关。如果要覆盖它,请适当设置$LC_COLLATE; CPOSIX中的任何一个都应该这样做。

答案 1 :(得分:3)

这取决于您的语言环境。如果您希望[A..Z]仅匹配大写字母,则可以使用C语言环境:将LC_COLLATELC_ALL设置为C

LC_ALL=C
ls [A..Z]*

bash manual, pattern matching

答案 2 :(得分:-1)

Unix shell实际上并不使用正则表达式,而是 glob patterns ,它们与正则表达式明显不同。一个区别是它们隐含地锚定在字符串的开头和结尾 - 例如ls foo[a-z]会列出文件food,但不列出fooble。它实际上不是ls在这里进行匹配,而是shell本身。 Globs也通常有时不区分大小写(取决于实现)。

查看您最喜欢的交互式shell的联机帮助页,并阅读有关全局匹配的内容 - 例如bash's manpage about filename expansion描述了它使用的语法。