相关疑难解决方法(0)

LC_COLLATE 是否(应该)影响字符范围?

Collat​​ion 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包括排序顺序之间az排序顺序中的所有内容,包括大写字母BZ.

所有测试的系统都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 …

regular-expression locale

27
推荐指数
1
解决办法
1万
查看次数

方括号通配中的区分大小写

通常,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)

shell bash wildcards locale

14
推荐指数
2
解决办法
2826
查看次数

为什么在 Shell (Bash) 中“字符类”比“字符范围”更受欢迎?

Linux 命令行(书籍 - 页数 47)说:

...您必须对它们 [字符范围] 非常小心,因为除非正确配置,否则它们不会产生预期的结果。现在,您应该避免使用它们并改用字符类。

这本书没有给出任何理由,除此之外。

问题- 1:那么,到底为什么要字符类(如[:alnum:][:alpha:][:digit:],等)优先于字符范围(如[a-z][A-Z][0-9],等)?

问题- 2:确实[:alpha:]代表[a-z][A-Z]上和其他语言的小写字母太?同样,是否也[:digit:]包括来自其他语言的数字?如果它们匹配,那就是。

(我知道有两个问题,但在这种情况下,它们几乎是相互关联的,IMO。)

command-line shell bash wildcards

5
推荐指数
1
解决办法
919
查看次数

使用条件运算符时的排序顺序是什么?

我编写了一个 bash 脚本来处理文件名列表(使用 glob 扩展,如for f in *),然后将该列表的一个子集输出到文件中。随后,我将这个文件的内容读入一个数组,并使用明显的<>运算符来比较字符串,对特定文件名执行简单的二进制搜索。

考虑到我希望脚本能够在 Linux、MacOS、MinGW 等许多不同的环境中工作……(即使它使用诸如[[stat不太便携的东西),我的问题是:

  1. 我是否需要对文件内容进行排序(使用sort或额外的 bash 代码)或者 glob 扩展是否总是排序 - 在每个环境中?
  2. 条件运算符是否使用与扩展(或之后sort)相同的“排序” ?

    扩展或sort返回file10.txt之后file2.txt(在什么情况下?)但使用条件运算符file10.txt会在之前file2.txt?我sort会用什么选项来解决这个问题?

  3. 如果我的某些文件名是 Unicode,有什么注意事项吗?

  4. 使用特定版本的 bash 是否有任何问题?
  5. 是否LC_COLLATE影响上述任何一项?

我显然需要文件内容来匹配运算符的排序“方法”,以便二分搜索按预期工作......

bash shell-script sort wildcards

5
推荐指数
1
解决办法
880
查看次数

什么表达式可以匹配 grep 命令中的模式 (^[0-9]..[a-zA-Z ]+$)?Linux bash

我试图了解正则表达式(^[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)

我尝试打开一个新的文本文件,然后仅键入我认为会被检测到的表达式,但它们都不匹配,因此我希望对此进行解释。

regular-expression

-1
推荐指数
1
解决办法
5355
查看次数