在Linux命令行中,William声称字符范围可能存在问题。见下文有关摘录,重点是我。
Character范围如果您来自另一个类似Unix的环境,或者正在阅读有关这个主题的其他书籍,您可能遇到过
[A-Z]和[a-z]字符范围标记。这些都是传统的Unix符号,也适用于较早版本的Linux。它们仍然可以工作,但是您必须小心它们,因为除非正确配置它们,否则它们不会产生预期的结果。现在,您应该避免使用它们,而应该使用字符类。
在最后几句话里他在说什么?POSIX标准对此有何说明?
发布于 2019-03-10 17:56:52
这很可能是指具有大写和小写字符交替排列的区域设置,而不是第一个,然后是另一个:
$ 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区域设置中,范围表达式表示排序规则序列中的两个元素之间的一组排序规则元素。在其他区域设置中,范围表达式具有未指定的行为:严格一致的应用程序不应依赖于范围表达式是否有效,也不应依赖于匹配的排序规则元素集。
https://unix.stackexchange.com/questions/505498
复制相似问题