LC_COLLATE (должен) влиять на диапазоны символов?

Большинство из нас установило переменную ПУТИ. Это покажет Вам, как автоматически заставить путь поиска человека соответствовать Вашему пути поиска команды.

Скажите добавление пути для включения персональных, определенных для работы и локально установленных утилит, как export PATH=$PATH:~/bin:/workgroup/bin:/opt/local/bin:. Как побочный эффект, man foo не покажет страницы справочника, сохраненные в ~ / человек,/workgroup/man или/opt/local/man.

Для разрешения этого я использую manpath управляйте для автоматической установки пути поиска страницы справочника. Например, мой ~/.bashrc имеет следующее. Это работает на меня в ста различных системах, выполняющих все из FreeBSD 4.x, Darwin и CentOS 5:

### PATH & MANPATH
# My personal utilities
export PATH=$PATH:$HOME/bin

### Set the manpath based on the PATH, after man(1) parses man.conf
# - No need to modify man.conf or manually modify MANPATH_MAP
# - Works on Linux, FreeBSD & Darwin, unlike /etc/manpaths.d/
# See "SEARCH PATH FOR MANUAL PAGES" in man(1)
# Just set the man search path. Don't print output to screeen.
manpath >/dev/null

Некоторые системы (Как Leopard Apple) устанавливают MANPATH автоматически, но это означает, что Ваша система будет использовать переменную MANPATH вместо использования manpath. В результате страницы справочника для 'MacPorts' (/opt/local/man) проигнорированы. Я хочу управлять этим сам, таким образом, я сбросил MANPATH:

unset MANPATH
manpath >/dev/null
27
08.08.2018, 15:03
2 ответа

Если Вы используете что-нибудь кроме C локаль, Вы не должны использовать диапазоны как [a-z] так как они зависимы от локали и не всегда дают результаты, которые Вы ожидали бы. А также случай выходит, Вы уже встретились, некоторые локали рассматривают символы с диакритическими знаками (например, á) то же как основной символ (т.е. a).

Вместо этого используйте именованный класс символов:

echo B | grep '[[:lower:]]'

Это будет всегда давать корректный результат для локали. Однако необходимо выбрать локаль для отражения значения и входного текста и теста, который Вы пытаетесь применить.

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

echo B | LANG=C grep '[a-z]'

Если это не работает как ожидалось, это действительно - ошибка.

3
27.01.2020, 19:39
  • 1
    я знаю, что, это не то, что я спросил. Я конкретно спрашиваю о том, что явный диапазон означает, и почему различные дистрибутивы (даже с GNU libc и GNU grep) имеют различные поведения. (Downvoted, потому что даже при том, что то, что Вы говорите, корректно, это не важно.) –  Gilles 'SO- stop being evil' 04.07.2011, 01:47
  • 2
    Моя точка - то, что значение явного диапазона зависимо от локали, и различные системы не требуются, чтобы определять свои локали тот же путь, таким образом, это не ошибка. Технически, Вы злоупотребляете системой, таким образом, Вы не должны быть удивлены получением "неопределенного" поведения. Кроме того, несколько человек прокомментировали, что они не могут воспроизвести поведение в своих системах Debian, таким образом, кажется, существует что-то необычное о Вашей системе (системах). –  Neil Mayhew 04.07.2011, 16:17
  • 3
    я знаю, что поведение диапазонов зависит от локалей. Я спрашиваю, как, и удивил то другое системное использование Glibc (и, это складывается, даже различные установки того же выпуска Debian) имеют различные поведения. Я добавил вывод locale -k к моему вопросу; это идентично на двух машинах Debian, та где B находится в диапазоне и том, где это не. BTW я не корень ни на одной машине (таким образом, это не что-то специфическое, что я делаю как администратор). –  Gilles 'SO- stop being evil' 04.07.2011, 22:46
  • 4
    названия ПК echo "Baü" | LC_COLLATE=C grep -o '[[:lower:]]' возвраты a И ü в то время как echo "Baü" | LC_COLLATE=C grep -o '[a-z]' возвраты только a. В моих глазах, "ниже" не действительно, что OP хотел –  Daniel Alder 24.01.2018, 14:47
  • 5
    Моя исходная точка все еще стоит, хотя: не используйте диапазоны, если Вы не находитесь в C локаль. Я полагаю, что это относится к OP, кто надеялся сообщать об ошибке. Если Вы не находитесь в C локаль, результаты использования диапазонов очень непредсказуемы и поэтому никогда не могут считаться ошибкой. С другой стороны, если необходимо найти конкретное значение байта, просто используйте C локаль. Моя вторичная точка была то, что, если Вы действительно хотите искать строчные буквы в локали, используйте класс символов. Даже при том, что OP не мог искать это, другие могли бы, если они находят этот вопрос. дополнительная функция –  Neil Mayhew 14.02.2018, 19:54

Диапазоны в регулярных выражениях должны наблюдать установку сопоставления. Вот соответствующий стандарт: http://pubs.opengroup.org/onlinepubs/007908799/xbd/re.html (ищут "выражения диапазона"). Так echo B | LC_COLLATE=en_US grep '[a-z]' должен произвести B учитывая разумное определение соответствующей локали. Я не могу объяснить, почему это иногда не работает на Вас, но я был бы очень удивлен, встретился ли я с этим в недревней системе, которая правильно установлена и настроена.

1
27.01.2020, 19:39
  • 1
    echo B | LC_COLLATE=en_US.utf8 grep '[a-z]' Ничего не печатает на Ubuntu 12.04 с grep 2.10. Ничего не печатает на Centos 6.5 с grep 2.6.3. Действительно работает над Debian 6.0.8 с grep 2.6.3. –  Ian D. Allen 27.01.2014, 08:20

Теги

Похожие вопросы