Последствия LC_ALL = C для ускорения grep - PullRequest
19 голосов
/ 15 ноября 2011

Я только что обнаружил, что если я префикс моих команд grep с LC_ALL = C, это делает чудеса для ускорения grep.

Но я задаюсь вопросом о последствиях.

Может ли шаблон с использованием UTF-8 не соответствовать? Что произойдет, если grep-файл использует UTF-8?

1 Ответ

18 голосов
/ 15 ноября 2011

Вам не обязательно нужен UTF-8, чтобы столкнуться с проблемами здесь.Локаль отвечает за установку классов символов, т. Е. За определение того, какой символ является пробелом, буквой или цифрой.Рассмотрим два следующих примера:

$ echo -e '\xe4' | LC_ALL=en_US.iso88591 grep '[[:alnum:]]' || echo false
ä
$ echo -e '\xe4' | LC_ALL=C grep '[[:alnum:]]' || echo false
false

При попытке сопоставить точные двоичные шаблоны друг с другом, языковой стандарт не имеет значения, однако:

$ echo -e '\xe4' | LC_ALL=en_US.iso88591 grep "$(echo -e '\xe4')" || echo false
ä
$ echo -e '\xe4' | LC_ALL=C grep "$(echo -e '\xe4')" || echo false
ä

Я не уверено степени grep, реализующей юникод, и о том, насколько хорошо разные кодовые точки сопоставляются друг с другом, но сопоставление любого подмножества ASCII и сопоставление отдельных символов без альтернативных двоичных представлений должно работать нормально независимо от локали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...