我每天都在做一些捣蛋,突然发现看似微不足道的东西不起作用:
$ echo T | grep [A-Z]
不匹配。
为什么T不在A-Z范围内?
我改变了正则表达式:
$ echo T | grep [A-Y]
比赛!
哇! T在A-Y中如何但不在A-Z中?
显然这是因为我的环境设置为爱沙尼亚语区域,其中Y位于字母表的末尾,但Z位于中间位置:ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY
$ echo $LANG
et_EE.UTF-8
这对我来说有点震惊。 99%的时候我会用计算机代码,而不是爱沙尼亚文学。我一直在以错误的方式使用grep吗?我过去因为这个而犯过什么样的错误?
在尝试了几件事后,我得出了以下解决方案:
$ echo T | LANG=C grep [A-Z]
这是使grep语言环境独立的推荐方法吗?
更多......定义像这样的别名是安全的:
$ alias grep="LANG=C grep"
PS。我也想知道为什么[A-Z]
语言环境中的字符范围首先依赖,而\w
似乎不受语言环境的影响(尽管手册说\w
相当于[[:alnum:]]
- 但我发现后者取决于区域设置而\w
没有。)
答案 0 :(得分:5)
POSIX正则表达式,Linux和FreeBSD grep自然支持,其他一些支持请求,有一系列[:xxx:]模式,以支持语言环境。有关详细信息,请参见手册页。
grep '[[:upper:]]'
由于[] s是模式名称的一部分,因此无论外观多么奇怪,您都需要外部[]。
随着这些代码的出现:经典\ w等编码严格保留在C语言环境中。因此,您选择的模式可确定grep是否使用当前区域设置。
[A-Z]应该遵循语言环境,但您可能需要设置LC_ALL而不是LANG,尤其是当系统将LC_ALL设置为不同的值时。