18.2. Remplacement

Bash lui-même ne reconnaît pas les expressions rationnelles. Dans les scripts, les commandes et utilitaires, tels que sed et awk, interprètent les ER.

Bash effectue bien l'expansion de noms de fichiers. [96] Ce processus est aussi connu sous le nom de « globbing » (NdT : remplacement) mais sans utiliser les ER standards. À la place, le remplacement reconnaît et étend les jokers. Le remplacement interprète les caractères jokers standards [97] -- * et ?, les listes de caractères entre crochets et certains autres caractères spéciaux (tels que ^ pour inverser le sens d'une correspondance). Néanmoins, il existe d'importantes limitations sur les caractères jokers dans le remplacement. Les chaînes contenant * ne restitueront pas les noms de fichiers commençant par un point, comme par exemple .bashrc. [98] De même, le ? a un sens différent dans le cadre du remplacement et comme partie d'une ER.

bash$ ls -l
total 2
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
-rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh
-rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt

bash$ ls -l t?.sh
-rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh

bash$ ls -l [ab]*
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1

bash$ ls -l [a-c]*
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1

bash$ ls -l [^ab]*
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
-rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh
-rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt

bash$ ls -l {b*,c*,*est*}
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
-rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
-rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt
             

Bash réalise une expansion du nom de fichier sur des arguments sans guillemets. La commande echo le démontre.

bash$ echo *
a.1 b.1 c.1 t2.sh test1.txt

bash$ echo t*
t2.sh test1.txt

bash$ echo t?.sh
t2.sh
              
[Note]

Note

Il est possible de modifier la façon dont Bash interprète les caractères spéciaux lors du remplacement. Une commande set -f désactive le remplacement, et les options nocaseglob et nullglob de shopt modifient le comportement du remplacement.

Voir aussi l'Exemple 11.4, « Opérer sur des fichiers à l'aide d'une boucle for ».



[96] L'expansion de noms de fichiers interprète les caractères spéciaux afin d'étendre aux noms de fichiers qui concordent avec le patron donné. Par exemple, exemple.??? pourrait être étendu à exemple.001 et/ou exemple.txt.

[97] Un caractère joker, comme au poker, représente (presque) indifféremment n'importe quel autre caractère.

[98] L'expansion de noms de fichiers peut faire des correspondances avec les fichiers commençant par un point, mais seulement si le modèle inclut spécifiquement le point comme caractère littéral.

~/[.]bashrc    # N'étendra pas en ~/.bashrc
~/?bashrc      # Là non plus.
               # Les caractères jokers et autres métacaractères ne s'étendront
               # PAS en un point lors d'un remplacement.

~/.[b]ashrc    # Sera étendu en ~./bashrc
~/.ba?hrc      # Ici ausi.
~/.bashr*      # De même.

# Activer l'option "dotglob" désactive ceci.

# Merci, S.C.