OnWorks Linux i Windows Online WorkStation

Menu
logo

Darmowy hosting online dla stacji roboczych

<Poprzedni | Spis treści | Następne>

Klasy znaków POSIX

Tradycyjne zakresy znaków to łatwo zrozumiały i skuteczny sposób rozwiązania problemu szybkiego określania zestawów znaków. Niestety, nie zawsze działają. Chociaż nie napotkaliśmy żadnych problemów z korzystaniem z grep jak dotąd możemy napotkać problemy podczas korzystania z innych programów.

W rozdziale 4 przyjrzeliśmy się, jak używane są symbole wieloznaczne do rozwijania nazw ścieżek. Podczas tej dyskusji powiedzieliśmy, że zakresów znaków można używać w sposób niemal identyczny, jak w wyrażeniach regularnych, ale tutaj pojawia się problem:



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

/usr/sbin/MAKEFLOPPIES

/usr/sbin/NetworkManagerDispatcher

/usr/sbin/NetworkManager

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

/usr/sbin/MAKEFLOPPIES

/usr/sbin/NetworkManagerDispatcher

/usr/sbin/NetworkManager


(W zależności od dystrybucji Linuksa otrzymamy inną listę plików, być może pustą. Ten przykład pochodzi z Ubuntu). To polecenie daje oczekiwany wynik-lista tylko plików, których nazwy zaczynają się od dużej litery, ale:


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

/usr/sbin/biosdecode

/usr/sbin/czat

/usr/sbin/chgpasswd

/usr/sbin/chpasswd

/usr/sbin/chroot

/usr/sbin/cleanup-info

/usr/sbin/skarga

/usr/sbin/demon-zestawu-konsoli

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

/usr/sbin/biosdecode

/usr/sbin/czat

/usr/sbin/chgpasswd

/usr/sbin/chpasswd

/usr/sbin/chroot

/usr/sbin/cleanup-info

/usr/sbin/skarga

/usr/sbin/demon-zestawu-konsoli


za pomocą tego polecenia otrzymujemy zupełnie inny wynik (pokazana jest tylko częściowa lista wyników). Dlaczego? To długa historia, ale oto krótka wersja:

Kiedy po raz pierwszy opracowano Unix, wiedział on tylko o znakach ASCII i ta funkcja odzwierciedla ten fakt. W kodzie ASCII pierwsze 32 znaki (cyfry 0–31) to kody sterujące (takie jak tabulatory, cofnięcia i powrót karetki). Następne 32 (32–63) zawierają znaki możliwe do wydrukowania, w tym większość znaków interpunkcyjnych i cyfry od zera do dziewięciu. Kolejne 32 (cyfry 64-95) zawierają wielkie litery i jeszcze kilka znaków interpunkcyjnych. Ostatnie 31 (cyfry 96–127) zawiera małe litery i jeszcze więcej symboli interpunkcyjnych. W oparciu o ten układ systemy używające ASCII używały a kolejność zestawień wyglądało to tak:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz Różni się to od właściwej kolejności słownikowej, która wygląda następująco: aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ

W miarę jak popularność Uniksa rozprzestrzeniła się poza Stany Zjednoczone, wzrosła potrzeba obsługi znaków, których nie można znaleźć w amerykańskim angielskim. Tablicę ASCII rozszerzono tak, aby wykorzystywała pełne osiem bitów, dodając znaki o numerach 128–255, co umożliwiło obsługę znacznie większej liczby języków. Aby wesprzeć tę możliwość, standardy POSIX wprowadziły koncepcję zwaną a lokalny, który można dostosować, aby wybrać zestaw znaków potrzebny dla określonej lokalizacji. Za pomocą tego polecenia możemy zobaczyć ustawienia języka naszego systemu:



[ja@linuxbox ~]$ echo $ LANG

en_US.UTF-8

[ja@linuxbox ~]$ echo $ LANG

en_US.UTF-8


Przy tym ustawieniu aplikacje zgodne z POSIX będą używać słownikowej kolejności sortowania, a nie kolejności ASCII. To wyjaśnia zachowanie powyższych poleceń. Zakres znaków [AZ] przy interpretacji słownikowej kolejność obejmuje wszystkie znaki alfabetu z wyjątkiem małej litery „a”, stąd nasze wyniki.

Aby częściowo obejść ten problem, standard POSIX zawiera szereg klas znaków, które zapewniają przydatne zakresy znaków. Zostały one opisane w tabeli poniżej


Niska:

Tabela 19-2: Klasy znaków POSIX


Opis klasy postaci

Opis klasy postaci

[:alnum:] Znaki alfanumeryczne. W ASCII odpowiednik:

[A-Za-z0-9]


obraz

[:słowo:] To samo co [:alnum:], z dodatkiem podkreślenia (_) postać.


obraz

[:alpha:] Znaki alfabetu. W ASCII odpowiednik:

[A-Za-z]


obraz

[:blank:] Zawiera znaki spacji i tabulacji.


obraz

[:ctrl:] Kody kontrolne ASCII. Zawiera znaki ASCII od 0 do 31 i 127.


obraz

[:digit:] Cyfry od zera do dziewięciu.


obraz

[:graph:] Widoczne znaki. W kodzie ASCII zawiera znaki 33

przez 126.


obraz

[:lower:] Małe litery.


obraz

[:punct:] Znaki interpunkcyjne. W ASCII odpowiednik:

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


obraz

[:print:] Znaki, które można wydrukować. Wszystkie postacie w [:wykres:]

plus znak spacji.


obraz

[:space:] Białe znaki, w tym spacja, tabulator i karetka

powrót, znak nowej linii, tabulator pionowy i wysuw formularza. W ASCII odpowiednik:

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


obraz

[:upper:] Wielkie litery.


obraz

[:xdigit:] Znaki używane do wyrażania liczb szesnastkowych. W ASCII odpowiednik:

[0-9A-Fa-f]


obraz


Nawet w przypadku klas znaków nadal nie ma wygodnego sposobu wyrażania zakresów częściowych, takich jak [AM].

Używając klas znaków, możemy powtórzyć listę naszych katalogów i zobaczyć lepszy wynik:


[ja@linuxbox ~]$ ls /usr/sbin/[[:upper:]]*

/usr/sbin/MAKEFLOPPIES

/usr/sbin/NetworkManagerDispatcher

/usr/sbin/NetworkManager

[ja@linuxbox ~]$ ls /usr/sbin/[[:upper:]]*

/usr/sbin/MAKEFLOPPIES

/usr/sbin/NetworkManagerDispatcher

/usr/sbin/NetworkManager


obraz

Pamiętaj jednak, że nie jest to przykład wyrażenia regularnego, a raczej powłoka wykonująca rozwinięcie nazwy ścieżki. Pokazujemy to tutaj, ponieważ w obu przypadkach można używać klas znaków POSIX.


Powrót do tradycyjnej kolejności sortowania

Możesz zdecydować się na używanie przez system tradycyjnej kolejności sortowania (ASCII), zmieniając wartość parametru JĘZYK Zmienna środowiskowa. Jak widzieliśmy powyżej, JĘZYK zmienna zawiera nazwę języka i zestawu znaków używanych w ustawieniach regionalnych. Wartość ta została pierwotnie określona podczas wybierania języka instalacji podczas instalacji systemu Linux.

Aby zobaczyć ustawienia regionalne, użyj opcji lokalny polecenie:

[ja@linuxbox ~]$ lokalny 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="en_US.UTF- 8" LC_MESSAGES="pl_US.UTF-8" LC_PAPER="pl_US.UTF-8" LC_NAME="pl_US.UTF-8" LC_ADDRESS="pl_US.UTF-8" LC_TELEPHONE="pl_US.UTF-8" LC_MEASUREMENT=" en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=

Aby zmienić ustawienia regionalne, aby używać tradycyjnych zachowań Uniksa, ustaw JĘZYK zmienna do POSIX:

[ja@linuxbox ~]$ eksportuj LANG=POSIX

Należy pamiętać, że ta zmiana powoduje, że system używa języka angielskiego (a dokładniej ASCII) jako zestawu znaków, więc upewnij się, czy naprawdę tego chcesz.


obraz

Możesz wprowadzić tę zmianę na stałe, dodając tę ​​linię do swojego .bashrc

file:

eksportuj LANG=POSIX


Najlepsze przetwarzanie w chmurze dla systemu operacyjnego w OnWorks: