是什么意思?

我已经注意到有一段时间了,至less在我使用的一些基于Unix的系统上, ls [AZ]*给了我预期来自ls [A-Za-z]* ,不能轻易得到一个大写字母开头的文件列表。 我刚才用grep遇到了同样的情况,在那里我不能用[AZ]来匹配小写字母,直到我最终使用grep -P来获取Perl正则expression式

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

  1. 这个白痴什么时候开始的?
  2. 谁负责,需要受到惩罚?
  3. 为什么???
  4. 对于lsgrep情况之一或两者是否有一些相当简单的解决方法? (例如,尝试一下, grep --no-ignore-case是徒劳的grep -P并不是一个很好的解决方法,因为它的实验性function状态。)

它实际上是[A-Za-y] ,它与语言整理有关。 如果你想覆盖它,然后适当设置$LC_COLLATE ; C或者POSIX都应该这样做。

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

 LC_ALL=C ls [A..Z]* 

bash手册,模式匹配

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

看看你最喜欢的交互式shell的手册页,并阅读关于glob匹配的内容 – 例如bash有关文件名扩展的manpage描述了它使用的语法。