1

当前文件夹中有一个名为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]不会匹配 's'。

问题

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

4

1 回答 1

0

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

看到这个线程

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

于 2017-12-22T08:22:02.740 回答