<Попередній | зміст | Наступна>
Класи символів POSIX
Традиційні діапазони символів є легко зрозумілим і ефективним способом вирішення проблеми швидкого визначення наборів символів. На жаль, вони не завжди працюють. Поки ми не зіткнулися з жодними проблемами з нашим використанням GREP поки що у нас можуть виникнути проблеми з використанням інших програм.
Ще в главі 4 ми розглянули, як підстановкові знаки використовуються для розширення імені шляху. У цьому обговоренні ми сказали, що діапазони символів можна використовувати майже так само, як вони використовуються в регулярних виразах, але ось проблема:
[me@linuxbox ~]$ ls /usr/sbin/[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*
/usr/sbin/MAKEFLOPPIES
/usr/sbin/NetworkManagerDispatcher
/usr/sbin/Менеджер мережі
[me@linuxbox ~]$ ls /usr/sbin/[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*
/usr/sbin/MAKEFLOPPIES
/usr/sbin/NetworkManagerDispatcher
/usr/sbin/Менеджер мережі
(Залежно від дистрибутива Linux ми отримаємо інший список файлів, можливо, порожній список. Цей приклад із Ubuntu). Ця команда дає очікуваний результат - список лише файлів, імена яких починаються з великої літери, але:
[me@linuxbox ~]$ ls /usr/sbin/[AZ]*
/usr/sbin/biosdecode
/usr/sbin/chat
/usr/sbin/chgpasswd
/usr/sbin/chpasswd
/usr/sbin/chroot
/usr/sbin/cleanup-info
/usr/sbin/complain
/usr/sbin/console-kit-daemon
[me@linuxbox ~]$ ls /usr/sbin/[AZ]*
/usr/sbin/biosdecode
/usr/sbin/chat
/usr/sbin/chgpasswd
/usr/sbin/chpasswd
/usr/sbin/chroot
/usr/sbin/cleanup-info
/usr/sbin/complain
/usr/sbin/console-kit-daemon
за допомогою цієї команди ми отримуємо зовсім інший результат (показано лише частковий перелік результатів). Чому так? Це довга історія, але ось коротка версія:
Коли Unix тільки був розроблений, він знав лише символи ASCII, і ця функція відображає цей факт. У ASCII перші 32 символи (числа 0-31) є керуючими кодами (наприклад, табуляції, пробіли та повернення каретки). Наступні 32 (32-63) містять символи для друку, включаючи більшість знаків пунктуації та цифри від нуля до дев'яти. Наступні 32 (номери 64-95) містять великі літери та ще кілька знаків пунктуації. Останні 31 (числа 96-127) містять малі літери та ще більше знаків пунктуації. На основі цієї домовленості системи, що використовують ASCII, використовували a порядок зіставлення це виглядало так:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz Це відрізняється від правильного порядку словника, який виглядає так: aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRswStTuXUvY
Оскільки популярність Unix поширилася за межі Сполучених Штатів, зросла потреба підтримувати символи, яких немає в американській англійській мові. Таблиця ASCII була розширена, щоб використовувати повні вісім бітів, додавши символи з номерами 128-255, що вміщало набагато більше мов. Щоб підтримати цю здатність, стандарти POSIX ввели концепцію, яка називається a місце дії, який можна налаштувати, щоб вибрати набір символів, необхідний для певного місця. Ми можемо побачити налаштування мови нашої системи за допомогою цієї команди:
[me@linuxbox ~]$ echo $LANG
uk_US.UTF-8
[me@linuxbox ~]$ echo $LANG
uk_US.UTF-8
З цим параметром POSIX-сумісні програми використовуватимуть порядок зіставлення словника, а не порядок ASCII. Це пояснює поведінку наведених вище команд. Діапазон символів [AZ] при інтерпретації в словниковому порядку включає всі символи алфавіту, окрім нижнього регістру «a», отже, наші результати.
Щоб частково обійти цю проблему, стандарт POSIX включає ряд класів символів, які надають корисні діапазони символів. Вони описані в таблиці:
низький:
Таблиця 19-2: Класи символів POSIX
Опис класу персонажів
Опис класу персонажів
[:alnum:] Алфавітно-цифрові символи. У ASCII еквівалентно:
[A-Za-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-9A-Fa-f]
![]()
Навіть із символьними класами все ще немає зручного способу виразити часткові діапазони, наприклад [AM].
Використовуючи класи символів, ми можемо повторити наш список каталогів і побачити покращений результат:
[me@linuxbox ~]$ ls /usr/sbin/[[:upper:]]*
/usr/sbin/MAKEFLOPPIES
/usr/sbin/NetworkManagerDispatcher
/usr/sbin/Менеджер мережі
[me@linuxbox ~]$ ls /usr/sbin/[[:upper:]]*
/usr/sbin/MAKEFLOPPIES
/usr/sbin/NetworkManagerDispatcher
/usr/sbin/Менеджер мережі

Пам’ятайте, однак, що це не приклад регулярного виразу, це скоріше оболонка, яка виконує розширення імені шляху. Ми показуємо це тут, тому що класи символів POSIX можна використовувати для обох.
Повернення до традиційного порядку зіставлення
Ви можете вибрати, щоб ваша система використовувала традиційний (ASCII) порядок зіставлення, змінивши значення МОВА змінна середовища. Як ми бачили вище, МОВА змінна містить назву мови та набір символів, що використовуються у вашій мові. Це значення було спочатку визначено, коли ви вибрали мову встановлення під час інсталяції Linux.
Щоб переглянути налаштування мовного стандарту, скористайтеся місце дії команда:
[me@linuxbox ~]$ місце дії LANG=uk_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="en_US.UTF-8" 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-XNUMX" LC_ALL=
Щоб змінити локаль для використання традиційної поведінки Unix, встановіть МОВА змінна до POSIX:
[me@linuxbox ~]$ експорт LANG=POSIX
Зауважте, що ця зміна перетворює систему на використання американської англійської (точніше, ASCII) для свого набору символів, тому переконайтеся, що це дійсно те, що ви хочете.

Ви можете зробити цю зміну постійною, додавши цей рядок до свого .bashrc
Файл:
експорт LANG=POSIX
документація