Вэтот вопросесть комментарий, который гласит:
Все это из-за непонимания того, что означает «в локали POSIX». (-: Вам действительно стоит попробовать сопоставить греческие строчные буквы с помощью (скажем) sed и [[:lower:]] и удобного набора локалей el_GR.UTF-8. – JdeBP
Итак: что означает «в локали POSIX»?
Бонус: допустимо ли это в POSIX в локалях, отличных от C?
LC_ALL=C grep '[[:lower:]]' file
решение1
Когда POSIX говорит (для «верхнего»)
В локали POSIX только:
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ
должны быть включены:
это определение локали POSIX. Это означает, что в контексте локали POSIX «верхний» класс символов состоит только из перечисленных символов.
POSIX не определяет никаких других локалей, но системы могут свободно это делать. В результате вы не можете рассчитывать на grep '[[:lower:]]' file
выполнение чего-либо полезного в локали, отличной от POSIX, если вы ограничиваете себя только POSIX. Однако многие системы определяют другие локали и их классы символов. Например, в системе, использующей локали библиотеки GNU C,
$ echo 'α' | LC_ALL=el_GR.UTF-8 grep '[[:lower:]]'
α
(Предполагается, что el_GR.UTF-8
локаль доступна; в производных дистрибутивах Debian быстрый способ убедиться в этом — установить пакет locales-all
.)
решение2
Я не совсем понял ваше предложение (в другом вопросе). Однако, похоже, вы неверно истолковали вариант использованияPOSIX-локаль.
Ваше предположение, похоже, заключается в том, что локаль не оченьпользовательДружелюбный. И что его следует скорректировать, чтобы он был таким. ОднакопользовательДружелюбность не является целью локальной настройки posix, это задача других локалей с другими правилами.
Задача локального posix — быть предсказуемым. На самом деле, он также выигрывает от простоты. Как только вы начинаете включать другие языки в стандарт, очень трудно остановиться, и в результате получается стандарт, который требует большого обслуживания и который трудно реализовать.
Я, как разработчик, не могу знать все правила для каждого языка, как сортировать их в "алфавитном" порядке и знать, какие из них являются заглавными, а какие - строчными. Правила для языков, отличных от английского, могут быть очень сложными. Поэтому если вы настроите локальный Posix, включив в него правила для всех остальных языков, вы сделаете его поведение действительно очень непредсказуемым.
Изменения в локали posix действительно могли бы нанести ущерб программному обеспечению, если бы старые системы не соответствовали поведению новых систем. (См. анекдот ниже)
Анекдот
Одна из самых непонятных и сложных для диагностики ошибок, которые я когда-либо видел, была вETL-инструмент"случайно" отбрасывая строки. После кропотливого анализа выяснилось, что программное обеспечение работало нормально, но только если запускалось с LC_COLLATE=C. Это было потому, что при сопоставлении записей оно полагалось на порядок сортировки из базы данных, соответствующий его собственному внутреннему порядку сортировки. Разработчики просто никогда не замечали, что в некоторых локалях числа сортируют текст в алфавитном порядке "0, -1, 1, -2, 2" вместо "-1, -2, 1, 2".
Помимо взаимодействия с пользователем, это демонстрирует реальную потребность в том, чтобы системы вели себя предсказуемым образом, который может быть общим для всех систем.