Collation order throughLC_COLLATE
不仅定义了单个字符的排序顺序,还定义了字符范围的含义。或者是吗?考虑以下片段:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Run Code Online (Sandbox Code Playgroud)
直观地说,B
不是 in [a-z]
,所以这不应该输出任何东西。这就是 Ubuntu 8.04 或 10.04 上发生的事情。但是在一些运行 Debian lenny 或挤压的机器上,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 …
通常,bash globbing 区分大小写:
$ echo c*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo C*
CarePackage.md ChocRippleCake.md Clips
Run Code Online (Sandbox Code Playgroud)
使用方括号似乎不会改变这一点:
$ echo [c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C]*
CarePackage.md ChocRippleCake.md Clips
Run Code Online (Sandbox Code Playgroud)
如果使用连字符,它仍然不会改变它:
$ echo [c-c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C-C]*
CarePackage.md ChocRippleCake.md Clips
Run Code Online (Sandbox Code Playgroud)
但是字母是穿插的:
$ echo [B-C]*
CarePackage.md casefix.pike cdless chalices.py charconv.py chocolate.pike ChocRippleCake.md circum.py clip.pike Clips cpustats.pike crop.pike cwk2txt.py
$ …
Run Code Online (Sandbox Code Playgroud) Linux 命令行(书籍 - 页数 47)说:
...您必须对它们 [字符范围] 非常小心,因为除非正确配置,否则它们不会产生预期的结果。现在,您应该避免使用它们并改用字符类。
这本书没有给出任何理由,除此之外。
问题- 1:那么,到底为什么要字符类(如[:alnum:]
,[:alpha:]
,[:digit:]
,等)优先于字符范围(如[a-z]
,[A-Z]
,[0-9]
,等)?
问题- 2:确实[:alpha:]
代表[a-z]
,[A-Z]
和上和其他语言的小写字母太?同样,是否也[:digit:]
包括来自其他语言的数字?如果它们匹配,那就是。
(我知道有两个问题,但在这种情况下,它们几乎是相互关联的,IMO。)
我编写了一个 bash 脚本来处理文件名列表(使用 glob 扩展,如for f in *
),然后将该列表的一个子集输出到文件中。随后,我将这个文件的内容读入一个数组,并使用明显的<
和>
运算符来比较字符串,对特定文件名执行简单的二进制搜索。
考虑到我希望脚本能够在 Linux、MacOS、MinGW 等许多不同的环境中工作……(即使它使用诸如[[
和stat
不太便携的东西),我的问题是:
sort
或额外的 bash 代码)或者 glob 扩展是否总是排序 - 在每个环境中?条件运算符是否使用与扩展(或之后sort
)相同的“排序” ?
扩展或sort
返回file10.txt
之后file2.txt
(在什么情况下?)但使用条件运算符file10.txt
会在之前file2.txt
?我sort
会用什么选项来解决这个问题?
如果我的某些文件名是 Unicode,有什么注意事项吗?
LC_COLLATE
影响上述任何一项? 我显然需要文件内容来匹配运算符的排序“方法”,以便二分搜索按预期工作......
我试图了解正则表达式(^[0-9]..[a-zA-Z ]+$)
在grep
命令中检测到的表达式(Linux 终端)
我知道如果我写以下命令:
grep ^[0-9]..[a-zA-Z] filename.txt
Run Code Online (Sandbox Code Playgroud)
我将检测任何包含表达式的行,例如92afg
但我不确定其+$
含义以及我能够使用命令检测到哪种表达式
grep ^[0-9]..[a-zA-Z]+$ filename.txt
Run Code Online (Sandbox Code Playgroud)
我尝试打开一个新的文本文件,然后仅键入我认为会被检测到的表达式,但它们都不匹配,因此我希望对此进行解释。