Linux命令行(书-页数47)说:
...您必须非常小心它们[字符范围],因为除非正确配置,否则它们不会产生预期的结果。现在,您应该避免使用它们,而应使用字符类。
除此之外,这本书没有任何理由。
问题- 1:那么,到底为什么要字符类(如[:alnum:]
,[:alpha:]
,[:digit:]
,等)优先于字符范围(如[a-z]
,[A-Z]
,[0-9]
,等)?
问题- 2:确实[:alpha:]
代表[a-z]
,[A-Z]
和上和其他语言的小写字母太?同样,是否也[:digit:]
包括其他语言的数字?如果它们匹配,那就是。
(我知道两个问题,但是在这种情况下,它们是相互关联的,IMO。)
根据bash
联机帮助页的说明,LC_COLLATE
环境变量会影响字符范围,完全取决于Hauke Laging的回答:
LC_COLLATE该变量确定排序路径名扩展结果时使用的排序规则顺序,并确定范围表达式,等价类以及路径名扩展和模式匹配内的整理序列的行为。
另一方面,LC_CTYPE
会影响字符类:
LC_CTYPE此变量确定路径名扩展和模式匹配内的字符解释和字符类的行为。
这意味着,如果您在英语,从左到右,拉丁字母,阿拉伯数字的上下文中进行思考,则这两种情况都可能有问题。
如果您确实很合适,并且/或者正在为多语言环境编写脚本,那么最好是确保在匹配文件时知道您的语言环境变量,或者确保您在完全通用的方式。
除非您学习过语言学,否则很难预见某些情况。
但是,我不知道会更改字母顺序的使用拉丁语的语言环境,因此[az]会起作用。有是扩展拉丁字母是整理连字和发音符号不同。但是,这是一个小实验:
mkdir /tmp/test
cd /tmp/test
export LC_CTYPE=de_DE.UTF-8
export LC_COLLATE=de_DE.UTF-8
touch Grüßen
ls G* # This says ‘Grüßen’
ls *[a-z]en # This says nothing!
ls *[a-zß]en # This says ‘Grüßen’
ls Gr[a-z]*en # This says nothing!
这很有趣:至少对于德语来说,像ü这样的变音符号和像ß这样的连字都没有被折叠成拉丁字符。(或者那样,或者我搞砸了语言环境更改!)
当然,这可能对您不利,如果您要查找以字母开头的文件名,请使用[a-z]*
并将其应用于以“Ä”开头的文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句