通配符/通配符:字符范围是否有问题?

通配符/通配符:字符范围是否有问题?

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 语言环境中,范围表达式表示位于排序规则序列中两个元素之间(包括这两个元素)的排序元素集。在其他语言环境中,范围表达式具有未指定的行为:严格遵守的应用程序不应依赖于范围表达式是否有效,或匹配的整理元素集。

相关内容