Подтвердить что ты не робот

Последствия LC_ALL = C для ускорения grep

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

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

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

4b9b3361

Ответ 1

Вам не обязательно, чтобы 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, реализующего unicode, и о том, насколько хорошо разные кодовые точки сопоставляются друг с другом, но сопоставление любого подмножества ASCII и соответствия отдельных символов без альтернативных двоичных представлений должно работать нормально, независимо от языка.