Ошибка в 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 сортирует до них)...

Другие вопросы по тегам