整理顺序LC_COLLATE
不仅定义了各个字符的排序顺序,而且还定义了字符范围的含义。还是呢?考虑以下代码段:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
直观上,B
not in中[a-z]
,因此不应输出任何内容。这就是在Ubuntu 8.04或10.04上发生的情况。但是,在某些运行Debian lenny或squeeze的计算机上,B
发现了该字符,因为该范围a-z
包括排序规则之间a
和z
排序规则中的所有内容,包括大写字母B
到Z
。
所有测试的系统的确en_US
生成了语言环境。我还尝试过更改语言环境:在B
上面匹配的机器上,{en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}
除日语(使用任何可用编码)和C
/ 之外,每个可用语言环境(大多是基于拉丁语的:,也包括中文语言环境)中都会发生相同的情况POSIX
。
当您超出ASCII时,字符范围在正则表达式中意味着什么?为什么一方面某些Debian安装与另一方面的其他Debian安装与Ubuntu之间有区别?其他系统如何表现?谁是正确的,谁应该报告错误?
(请注意,我是专门询问字符范围的行为,例如[a-z]
在en_US
语言环境中,主要是在基于GNU libc的系统上。我不是在问如何匹配小写字母或ASCII小写字母。)
两个Debian的机器,一个地方B
是在[a-z]
和一个地方是不是,输出LC_COLLATE=en_US locale -k LC_COLLATE
就是
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
和的输出LC_COLLATE=en_US.utf8 locale -k LC_COLLATE
是
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
C
语言环境,则将语言环境用作后备,并且其整理顺序为直字节值,因此B
不会被匹配。在出现在的输出中的语言环境中进行测试locale -a
。
en_US
生成。