Онлайн робочі станції OnWorks Linux та Windows

логотип

Безкоштовний онлайн-хостинг для робочих станцій

<Попередній | зміст | Наступна>

Класи символів 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


Найпопулярніші хмарні обчислення ОС на OnWorks: