在Linux 命令行William Shots 声称字符范围可能存在问题。请参阅下面的相关摘录,重点是我的。
字符范围
如果您来自另一个类 Unix 环境或已经阅读过有关此主题的其他书籍,您可能遇到过
[A-Z]
和[a-z]
字符范围符号。这些是传统的 Unix 表示法,也适用于旧版本的 Linux。它们仍然可以工作,但您必须小心使用它们,因为除非正确配置,否则它们不会产生预期的结果。目前,您应该避免使用它们并使用字符类。
他最后几句话在说什么? POSIX 标准对此有何规定?
答案1
这很可能是指具有交替排序的大写和小写字符的语言环境,而不是第一个,然后是另一个:
$ echo "$LANG"
en_US.UTF-8
$ touch a A z Z
$ ls
A Z a z
$ bash -c 'echo [a-z]'
a A z
但是,适当的字符类可以工作:
$ bash -c 'echo [[:lower:]]'
a z
但也可能不仅仅a
匹配z
:
$ LANG=fi_FI.UTF-8
$ touch ä Ä ö Ö
$ bash -c 'echo [[:lower:]]'
a z ä ö
如果你想避免这种情况,并且只将英文小写字母a
与匹配z
,Bash 特别有一个选项可以按 ASCII 顺序解释范围:
$ bash -c 'shopt -s globasciiranges; echo [a-z]'
a z
您始终可以强制使用默认的整理顺序:
$ LC_COLLATE=C bash -c 'echo [a-z]'
a z
至于 POSIX 所说的,在我看来,除了默认 POSIX 语言环境之外,括号表达式中的范围在语言环境中未定义。模式匹配描述指的是括号表达式的正则表达式描述,其中说:
在 POSIX 语言环境中,范围表达式表示位于排序规则序列中两个元素之间(包括这两个元素)的排序元素集。在其他语言环境中,范围表达式具有未指定的行为:严格遵守的应用程序不应依赖于范围表达式是否有效,或匹配的整理元素集。