当前文件夹中有一个名为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]
将无法匹配'。 问题
为什么这些结果是我的搜索结果?
答案 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]
将包含a
到y
的带有变音符号的拉丁字母,但不包含z
的拉丁字母}(因为z
在它们之前排序)...