findutils中关于不区分大小写的错误?

时间:2017-12-21 08:56:00

标签: regex gnu-findutils

当前文件夹中有一个名为foo.js的文件。

我使用find来搜索:

tigerlei::~/work $ ll foo.js
-rw-rw-r-- 1 tigerlei tigerlei 187 Mar 29  2017 foo.js

tigerlei::~/work $ find . -regex '.*/foo.*.j[R-T]+' -regextype egrep
./foo.js

tigerlei::~/work $ find . -regex '.*/foo.*.j[RST]+' -regextype egrep

tigerlei::~/work $ find . -iregex '.*/foo.*.j[RST]+' -regextype egrep
./foo.js

我的系统是ubuntu 14.04。

findutil的版本是4.4.2

当我使用-regex时,find将使用区分大小写的模式。但是:

  • [R-T]将匹配小写字母' s'和
  • [RST]将无法匹配'。

问题

为什么这些结果是我的搜索结果?

1 个答案:

答案 0 :(得分:0)

您需要设置LC_ALL=C以确保括号表达式中形成范围的字符的顺序与ASCII表中的顺序相同。

请参阅this thread

  

如果您要使用用户的语言匹配字母,请使用grep '[[:alpha:]]'并且不要修改LC_ALL。但是,如果您想匹配a-zA-Z个ASCII字符,则需要LC_ALL=C grep '[[:alpha:]]'LC_ALL=C grep '[a-zA-Z]'[a-z]匹配在a之后和z之前排序的字符(尽管有许多API,但它比这更复杂)。在其他语言环境中,您通常不知道它们是什么。例如,某些区域设置忽略了排序的大小写,因此在某些API(如bash模式)中[a-z]可能包含[B-Z][A-Y]。在许多UTF-8语言环境中(包括大多数系统上的en_US.UTF-8),[a-z]将包含ay的带有变音符号的拉丁字母,但不包含z的拉丁字母}(因为z在它们之前排序)...