Ошибка в findutils о регистрозависимости?
Есть файл с именем foo.js
в текущей папке.
Я использую поиск для поиска:
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'.
Вопрос
Почему эти результаты являются результатами моих поисков?
1 ответ
Вам нужно установить LC_ALL=C
чтобы символы, образующие диапазон в выражении в скобках, шли в том же порядке, что и в таблице ASCII.
Смотрите эту тему:
Если вы хотите сопоставить букву на языке пользователя, используйте
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 это сложнее). В других местах вы вообще не знаете, что это такое. Например, некоторые локали игнорируют регистр для сортировки, так[a-z]
в некоторых API, таких как шаблоны bash, может включать[B-Z]
или же[A-Y]
, Во многих регионах UTF-8 (в том числеen_US.UTF-8
на большинстве систем),[a-z]
будет включать латинские буквы отa
вy
с диакритическими знаками, но не те,z
(посколькуz
сортирует до них)...