我已经注意到一段时间了,在我至少使用的一些基于Unix的系统上,ls [A-Z]*
一直在给我ls [A-Za-z]*
预期的结果,让我无法轻松获取以大写字母开头的该死的文件列表。我刚刚与grep
发生了同样的事情,在那里我无法让小写字母与[A-Z]
匹配,直到我最终使用grep -P
来获取Perl正则表达式。
所以我有一些相关的问题:
ls
和grep
个案例中的一个或两个,是否有一些相当简单的解决方法? (例如,尝试grep --no-ignore-case
没有结果。grep -P
由于其实验性功能状态而不是一个非常好的解决方法。)答案 0 :(得分:15)
实际上是[A-Za-y]
,它与语言整理有关。如果要覆盖它,请适当设置$LC_COLLATE
; C
或POSIX
中的任何一个都应该这样做。
答案 1 :(得分:3)
这取决于您的语言环境。如果您希望[A..Z]
仅匹配大写字母,则可以使用C语言环境:将LC_COLLATE
或LC_ALL
设置为C
。
LC_ALL=C
ls [A..Z]*
答案 2 :(得分:-1)
Unix shell实际上并不使用正则表达式,而是 glob patterns ,它们与正则表达式明显不同。一个区别是它们隐含地锚定在字符串的开头和结尾 - 例如ls foo[a-z]
会列出文件food
,但不列出fooble
。它实际上不是ls
在这里进行匹配,而是shell本身。 Globs也通常有时不区分大小写(取决于实现)。
查看您最喜欢的交互式shell的联机帮助页,并阅读有关全局匹配的内容 - 例如bash's manpage about filename expansion描述了它使用的语法。