Онлайн-рабочие станции OnWorks Linux и Windows

Логотип

Бесплатный хостинг в Интернете для рабочих станций

<Предыдущая | Содержание: | Следующая>

Классы символов POSIX

Традиционные диапазоны символов - это простой и эффективный способ решения проблемы быстрого определения наборов символов. К сожалению, они не всегда работают. Хотя мы не столкнулись с какими-либо проблемами при использовании GREP пока что мы можем столкнуться с проблемами при использовании других программ.

Еще в главе 4 мы рассмотрели, как подстановочные знаки используются для раскрытия имени пути. В этом обсуждении мы сказали, что диапазоны символов можно использовать почти так же, как они используются в регулярных выражениях, но вот проблема:



[я @ linuxbox ~] $ ls / usr / sbin / [ABCDEFGHIJKLMNOPQRSTUVWXYZ] *

/ usr / sbin / MAKEFLOPPIES

/ usr / sbin / NetworkManagerDispatcher

/ usr / sbin / NetworkManager

[я @ linuxbox ~] $ ls / usr / sbin / [ABCDEFGHIJKLMNOPQRSTUVWXYZ] *

/ usr / sbin / MAKEFLOPPIES

/ usr / sbin / NetworkManagerDispatcher

/ usr / sbin / NetworkManager


(В зависимости от дистрибутива Linux мы получим другой список файлов, возможно, пустой список. Этот пример взят из Ubuntu). Эта команда дает ожидаемый результат-список только файлов, имена которых начинаются с заглавной буквы, но:


[я @ linuxbox ~] $ ls / usr / sbin / [AZ] *

/ usr / sbin / biosdecode

/ usr / sbin / чат

/ usr / sbin / chgpasswd

/ usr / sbin / chpasswd

/ usr / sbin / chroot

/ usr / sbin / информация об очистке

/ usr / sbin / жаловаться

/ usr / sbin / консоль-кит-демон

[я @ linuxbox ~] $ ls / usr / sbin / [AZ] *

/ usr / sbin / biosdecode

/ usr / sbin / чат

/ usr / sbin / chgpasswd

/ usr / sbin / chpasswd

/ usr / sbin / chroot

/ usr / sbin / информация об очистке

/ usr / sbin / жаловаться

/ usr / sbin / консоль-кит-демон


с помощью этой команды мы получаем совершенно другой результат (показан только частичный список результатов). Это почему? Это длинная история, но вот краткая версия:

Когда Unix только разрабатывался, он знал только о символах ASCII, и эта особенность отражает этот факт. В ASCII первые 32 символа (числа от 0 до 31) являются управляющими кодами (например, табуляция, возврат и возврат каретки). Следующие 32 (32-63) содержат печатаемые символы, включая большинство знаков пунктуации и цифры от нуля до девяти. Следующие 32 (числа 64-95) содержат прописные буквы и еще несколько знаков препинания. Последние 31 (числа 96–127) содержат строчные буквы и еще несколько знаков препинания. Основываясь на этой схеме, системы, использующие ASCII, использовали порядок сортировки это выглядело так:

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

По мере того, как популярность Unix распространилась за пределы Соединенных Штатов, выросла потребность в поддержке символов, которых нет в американском английском. Таблица ASCII была расширена, чтобы использовать полные восемь битов, добавляя символы с номерами 128–255, что соответствует многим другим языкам. Для поддержки этой возможности стандарты POSIX представили концепцию, называемую местный, который можно отрегулировать, чтобы выбрать набор символов, необходимый для конкретного местоположения. Мы можем увидеть языковые настройки нашей системы, используя эту команду:



[я @ linuxbox ~] $ echo $ LANG

ru_US.UTF-8

[я @ linuxbox ~] $ echo $ LANG

ru_US.UTF-8


С этим параметром POSIX-совместимые приложения будут использовать порядок сортировки словаря, а не порядок ASCII. Это объясняет поведение приведенных выше команд. Диапазон символов [AZ] при интерпретации в словарном порядке включает все алфавитные символы, кроме строчной буквы «a», отсюда и наши результаты.

Чтобы частично обойти эту проблему, стандарт POSIX включает ряд классов символов, которые предоставляют полезные диапазоны символов. Они описаны в таблице ниже.


низкий:

Таблица 19-2: Классы символов POSIX


Описание класса персонажа

Описание класса персонажа

[: alnum:] Буквенно-цифровые символы. В ASCII эквивалентно:

[А-За-z0-9]


изображение

[:слово:] То же, что [: alnum:], с добавлением символа подчеркивания (_) персонаж.


изображение

[: alpha:] Буквенные символы. В ASCII эквивалентно:

[А-За-Я]


изображение

[: blank:] Включает символы пробела и табуляции.


изображение

[: cntrl:] Коды управления ASCII. Включает символы ASCII от 0 до 31 и 127.


изображение

[: digit:] Цифры от нуля до девяти.


изображение

[: graph:] Видимые символы. В ASCII он включает символы 33

через 126.


изображение

[: lower:] Строчные буквы.


изображение

[: punct:] Знаки пунктуации. В ASCII эквивалентно:

[-! "# $% & '() * +,. / :; <=>? @ [\\\] _` {|} ~]


изображение

[: print:] Печатные символы. Все персонажи в [: график:]

плюс пробел.


изображение

[: space:] Пробельные символы, включая пробел, табуляцию, каретку

возврат, новая строка, вертикальная табуляция и подача формы. В ASCII эквивалентно:

[\ t \ r \ n \ v \ f]


изображение

[: upper:] Заглавные буквы.


изображение

[: xdigit:] Символы, используемые для обозначения шестнадцатеричных чисел. В ASCII эквивалентно:

[0-9А-Фа-ф]


изображение


Даже с классами символов по-прежнему нет удобного способа выражения частичных диапазонов, например [AM].

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


[я @ linuxbox ~] $ ls / usr / sbin / [[: верхний:]] *

/ usr / sbin / MAKEFLOPPIES

/ usr / sbin / NetworkManagerDispatcher

/ usr / sbin / NetworkManager

[я @ linuxbox ~] $ ls / usr / sbin / [[: верхний:]] *

/ usr / sbin / MAKEFLOPPIES

/ usr / sbin / NetworkManagerDispatcher

/ usr / sbin / NetworkManager


изображение

Помните, однако, что это не пример регулярного выражения, скорее это оболочка, выполняющая раскрытие имени пути. Мы показываем это здесь, потому что классы символов POSIX могут использоваться для обоих.


Возврат к традиционному порядку сортировки

Вы можете выбрать, чтобы ваша система использовала традиционный (ASCII) порядок сортировки, изменив значение параметра ДЛИННЫЙ переменная окружения. Как мы видели выше, ДЛИННЫЙ переменная содержит название языка и набор символов, используемых в вашем языковом стандарте. Это значение изначально было определено при выборе языка установки при установке Linux.

Чтобы увидеть настройки локали, используйте местный команда:

[я @ linuxbox ~] $ местный LANG = en_US.UTF-8 LC_CTYPE = "en_US.UTF-8" LC_NUMERIC = "en_US.UTF-8" LC_TIME = "en_US.UTF-8" LC_COLLATE = "en_US.UTF-8" LC_MONETARY = "ru_US.UTF- 8 "LC_MESSAGES =" en_US.UTF-8 "LC_PAPER =" en_US.UTF-8 "LC_NAME =" en_US.UTF-8 "LC_ADDRESS =" en_US.UTF-8 "LC_TELEPHONE =" en_US.UTF-8 "LC_MEASUREMENT =" en_US.UTF-8 "LC_IDENTIFICATION =" en_US.UTF-8 "LC_ALL =

Чтобы изменить локаль для использования традиционного поведения Unix, установите ДЛИННЫЙ переменная до POSIX:

[я @ linuxbox ~] $ экспорт LANG = POSIX

Обратите внимание, что это изменение преобразует систему для использования английского языка (в частности, ASCII) в качестве набора символов, поэтому убедитесь, что это действительно то, что вам нужно.


изображение

Вы можете сделать это изменение постоянным, добавив эту строку в свой .bashrc

файл:

экспорт LANG = POSIX


Лучшие облачные вычисления для ОС в OnWorks: