Stations de travail en ligne OnWorks Linux et Windows

Logo

Hébergement gratuit en ligne pour les postes de travail

<Précédent | Table des matières | Suivant>

Classes de caractères POSIX

Les plages de caractères traditionnelles sont un moyen facile à comprendre et efficace pour résoudre le problème de la spécification rapide des ensembles de caractères. Malheureusement, ils ne fonctionnent pas toujours. Bien que nous n'ayons rencontré aucun problème avec notre utilisation de grep jusqu'à présent, nous pourrions rencontrer des problèmes en utilisant d'autres programmes.

De retour au chapitre 4, nous avons examiné comment les caractères génériques sont utilisés pour effectuer l'expansion des noms de chemin. Dans cette discussion, nous avons dit que les plages de caractères pouvaient être utilisées d'une manière presque identique à la façon dont elles sont utilisées dans les expressions régulières, mais voici le problème :



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

/usr/sbin/MAKEFLOPPIES

/usr/sbin/NetworkManagerDispatcher

/usr/sbin/NetworkManager

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

/usr/sbin/MAKEFLOPPIES

/usr/sbin/NetworkManagerDispatcher

/usr/sbin/NetworkManager


(Selon la distribution Linux, nous obtiendrons une liste de fichiers différente, éventuellement une liste vide. Cet exemple provient d'Ubuntu). Cette commande produit le résultat attendu-une liste des seuls fichiers dont les noms commencent par une lettre majuscule, mais :


[moi@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/plainte

/usr/sbin/console-kit-daemon

[moi@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/plainte

/usr/sbin/console-kit-daemon


avec cette commande, nous obtenons un résultat entièrement différent (seule une liste partielle des résultats est affichée). Pourquoi donc? C'est une longue histoire, mais voici la version courte :

À l'époque où Unix a été développé pour la première fois, il ne connaissait que les caractères ASCII, et cette fonctionnalité reflète ce fait. En ASCII, les 32 premiers caractères (numéros 0-31) sont des codes de contrôle (comme des tabulations, des retours arrière et des retours chariot). Les 32 (32-63) suivants contiennent des caractères imprimables, y compris la plupart des caractères de ponctuation et les chiffres de zéro à neuf. Les 32 suivants (numéros 64-95) contiennent les lettres majuscules et quelques autres symboles de ponctuation. Les 31 derniers (numéros 96-127) contiennent les lettres minuscules et encore plus de symboles de ponctuation. Sur la base de cet arrangement, les systèmes utilisant l'ASCII utilisaient un ordre de classement qui ressemblait à ceci:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz Ceci diffère de l'ordre correct du dictionnaire, qui ressemble à ceci : aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ

Alors que la popularité d'Unix s'étendait au-delà des États-Unis, il est devenu nécessaire de prendre en charge des caractères introuvables en anglais américain. La table ASCII a été étendue pour utiliser huit bits complets, en ajoutant des nombres de caractères 128-255, qui s'adaptaient à beaucoup plus de langues. Pour prendre en charge cette capacité, les normes POSIX ont introduit un concept appelé local, qui peut être ajusté pour sélectionner le jeu de caractères requis pour un emplacement particulier. Nous pouvons voir le paramètre de langue de notre système en utilisant cette commande :



[moi@linuxbox ~]$ echo $LONG

fr_US.UTF-8

[moi@linuxbox ~]$ echo $LONG

fr_US.UTF-8


Avec ce paramètre, les applications compatibles POSIX utiliseront un ordre de classement par dictionnaire plutôt qu'un ordre ASCII. Ceci explique le comportement des commandes ci-dessus. Une gamme de caractères de [AZ] lorsqu'il est interprété dans l'ordre du dictionnaire, il inclut tous les caractères alphabétiques à l'exception du « a » minuscule, d'où nos résultats.

Pour contourner partiellement ce problème, la norme POSIX inclut un certain nombre de classes de caractères qui fournissent des plages de caractères utiles. Ils sont décrits dans le tableau ci-dessous.


faible:

Tableau 19-2 : Classes de caractères POSIX


Description de la classe de caractères

Description de la classe de caractères

[:alnum:] Les caractères alphanumériques. En ASCII, équivalent à :

[A-Za-z0-9]


image

[:mot:] Identique à [:alnum:], avec l'ajout du trait de soulignement (_) personnage.


image

[:alpha:] Les caractères alphabétiques. En ASCII, équivalent à :

[A-Za-z]


image

[:blank:] Inclut les caractères espace et tabulation.


image

[:ctrl:] Les codes de contrôle ASCII. Comprend les caractères ASCII 0 à 31 et 127.


image

[:digit:] Les chiffres de zéro à neuf.


image

[:graph:] Les caractères visibles. En ASCII, il comprend les caractères 33

à travers 126.


image

[:lower:] Les lettres minuscules.


image

[:punct:] Les caractères de ponctuation. En ASCII, équivalent à :

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


image

[:print:] Les caractères imprimables. Tous les personnages de [:graphique:]

plus le caractère espace.


image

[:space:] Les caractères d'espacement, y compris l'espace, la tabulation, le chariot

retour, saut de ligne, tabulation verticale et saut de page. En ASCII, équivalent à :

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


image

[:upper:] Les caractères majuscules.


image

[:xdigit:] Caractères utilisés pour exprimer des nombres hexadécimaux. En ASCII, équivalent à :

[0-9A-Fa-f]


image


Même avec les classes de caractères, il n'y a toujours pas de moyen pratique d'exprimer des plages partielles, telles que [AM].

En utilisant des classes de caractères, nous pouvons répéter notre liste de répertoires et voir un résultat amélioré :


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

/usr/sbin/MAKEFLOPPIES

/usr/sbin/NetworkManagerDispatcher

/usr/sbin/NetworkManager

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

/usr/sbin/MAKEFLOPPIES

/usr/sbin/NetworkManagerDispatcher

/usr/sbin/NetworkManager


image

N'oubliez pas, cependant, qu'il ne s'agit pas d'un exemple d'expression régulière, mais plutôt du shell effectuant l'expansion du nom de chemin. Nous le montrons ici car les classes de caractères POSIX peuvent être utilisées pour les deux.


Revenir à l'ordre de classement traditionnel

Vous pouvez choisir que votre système utilise l'ordre de classement traditionnel (ASCII) en modifiant la valeur de LANGUE variable d'environnement. Comme nous l'avons vu plus haut, le LANGUE La variable contient le nom de la langue et le jeu de caractères utilisés dans vos paramètres régionaux. Cette valeur a été déterminée à l'origine lorsque vous avez sélectionné une langue d'installation lors de l'installation de Linux.

Pour voir les paramètres régionaux, utilisez le local commander:

[moi@linuxbox ~]$ local 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="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=

Pour modifier les paramètres régionaux afin d'utiliser les comportements Unix traditionnels, définissez le LANGUE variable à POSIX:

[moi@linuxbox ~]$ exporter LANG=POSIX

Notez que ce changement convertit le système pour utiliser l'anglais américain (plus précisément, l'ASCII) pour son jeu de caractères, alors assurez-vous que c'est vraiment ce que vous voulez.


image

Vous pouvez rendre ce changement permanent en ajoutant cette ligne à votre .bashrc

fichier:

exporter LANG=POSIX


Meilleur système d'exploitation Cloud Computing chez OnWorks :