2.3. Motifs d'englobement du shell, expressions rationnelles

Vous utilisez sans doute déjà des caractères d'englobement sans le savoir. Quand vous enregistrez un fichier dans une application sous Windows, quand vous recherchez un fichier, vous utilisez * pour désigner une suite de caractères quelconque. Par exemple, *.txt désigne l'ensemble des fichiers dont le nom se termine par .txt. Nous l'avons également beaucoup utilisé dans la section précédente. Mais l'englobement va beaucoup plus loin que le seul *.

Quand vous tapez une commande comme ls *.txt et tapez Entrée, la tâche de trouver quels fichiers correpondent au motif *.txt n'est pas du ressort de ls, mais par le shell lui-même. Cela requiert une petite explication sur la façon dont le shell interprète une ligne de commande. Quand vous tapez :

$ ls *.txt
readme.txt  recettes.txt

la ligne de commande est tout d'abord séparée en mots (ls et *.txt en l'occurrence). Quand le shell voit le * dans un des mots, il interprète le mot comme étant un motif englobant et le remplace dans la ligne de commande par les noms de tous les fichiers correspondant au motif. La ligne juste avant exécution par le shell est donc devenue ls readme.txt recettes.txt, ce qui donne le résultat recherché. Le shell réagit aussi à la vue d'autres caractères :

  1. ? correspond à un et un seul caractère, quel qu'il soit;

  2. [...] correspond à un des caractères entre les crochets; les caractères peuvent être désignés en intervalles (par exemple, 1-9) ou des valeurs discrètes, ou un mélange des deux. Exemple : [a-zBE5-7] correspond à tous les caractères de a à z, un B, un E, un 5, un 6 ou un 7;

  3. [!...] correspond à tous les caractères qui ne se trouvent pas entre les crochets; [!a-z], par exemple, correspond à tout caractère qui n'est pas une lettre minuscule;

  4. {c1,c2} correspond à c1 ou c2, où c1 et c2 sont eux-même des motifs d'englobement.

Voici quelques exemples de motifs et leurs significations :

  1. /etc/*conf Tous les fichiers du répertoire /etc dont le nom se termine par conf. Cela peut correspondre au fichier /etc/inetd.conf, mais aussi à /etc/conf.linuxconf, et à /etc/conf si un tel fichier existe. Souvenez-vous que * peut correspondre à une chaîne vide.

  2. image/cars,space[0-9]/*.jpg Tous les fichiers dont le nom se termine par .jpg dans les répertoires image/cars, image/space0, ... , image/space9, s'ils existent.

  3. /usr/doc/*/README Tous les fichiers de nom README dans tous les sous-répertoires immédiats de /usr/doc. Cela correspondra à /usr/doc/mandrake/README par exemple, mais pas à /usr/doc/myprog/doc/README.

  4. *[!a-z] Tous les fichiers du répertoire courant dont le nom ne finit pas par une lettre minuscule.