我已经注意到有一段时间了,至less在我使用的一些基于Unix的系统上, ls [AZ]*
给了我预期来自ls [A-Za-z]*
,不能轻易得到一个大写字母开头的文件列表。 我刚才用grep
遇到了同样的情况,在那里我不能用[AZ]
来匹配小写字母,直到我最终使用grep -P
来获取Perl正则expression式。
所以我有一些相关的问题:
ls
和grep
情况之一或两者是否有一些相当简单的解决方法? (例如,尝试一下, grep --no-ignore-case
是徒劳的grep -P
并不是一个很好的解决方法,因为它的实验性function状态。) 它实际上是[A-Za-y]
,它与语言整理有关。 如果你想覆盖它,然后适当设置$LC_COLLATE
; C
或者POSIX
都应该这样做。
这取决于你的语言环境。 如果您希望[A..Z]
只匹配大写字母,则可以使用C语言环境:将LC_COLLATE
或LC_ALL
设置为C
LC_ALL=C ls [A..Z]*
bash手册,模式匹配
Unix shell实际上并不使用正则表达式,而是使用glob模式 ,这与正则表达式截然不同。 一个区别是它们隐含地锚定在字符串的开头和结尾 – 例如ls foo[az]
将列出文件food
,但不是fooble
。 这实际上不是在这里做匹配,而是壳本身。 Globes 通常也有时不区分大小写 (取决于实现)。
看看你最喜欢的交互式shell的手册页,并阅读关于glob匹配的内容 – 例如bash有关文件名扩展的manpage描述了它使用的语法。