Mes documentations

« Retour à l'accueil

Manipulation des chaînes de caractères et des tableaux en bash

Date de rédaction: octobre 2014
Dernière modification: octobre 2014

L’interpréteur bash propose des fonctionnalités internes intéressantes pour manipuler une chaîne de caractères conservée dans une variable. Appliquées à un tableau, elles permettent également de modifier tous ses éléments en une opération. Voici une petite présentation des plus courantes de ces fonctionnalités.

Sommaire

  1. Précisions sur cette documentation
  2. Récupérer un sous-ensemble d’une chaîne de caractères
  3. Suppression du motif correspondant au préfixe
  4. Suppression du motif correspondant au suffixe
  5. Substitution de motif
  6. Modification de la casse
  7. Longueur d’une chaîne de caractères conservée dans une variable
  8. Pour en savoir plus

Précisions sur cette documentation

Récupérer un sous-ensemble d’une chaîne de caractères

${paramètre:début}
${paramètre:début:longueur}

Quelques exemples certainement assez explicit :

$ echo "[${var:5:7}]"
[ to the]
$ echo "${var:8}"
 the world
$ echo "${var: -5}"
world

La dernière forme permet de récupérer les 5 derniers caractères, mais nécessite de placer une espace entre le deux-points et le tiret, pour que bash ne confonde pas avec « :- » qui représente l’utilisation de valeur par défaut.

Utilisée avec un tableau, cette fonctionnalité permet d’en récupérer un sous-ensemble. Par exemple, on récupèrera ainsi les quatrième et cinquième éléments du tableau indicé :

$ tableau=( 0 1 2 3 4 5 )
$ echo ${tableau[@]:3:2}
3 4

La même opération permet donc de récupérer les troisième et quatrième paramètres du script ou de la fonction (le premier élément n’étant pas un paramètre mais le nom du script) :

$ echo ${@:3:2}

Suppression du motif correspondant au préfixe

${paramètre#mot}
${paramètre##mot}

La première forme enlève le plus court motif, et la seconde le plus long :

echo "Good morning ${var#Hello }"
Good morning to the world

Ceci permet par exemple de récupérer le nom de fichier à partir de son chemin absolu (comme le fait la commande basename) :

$ fichier="/usr/share/doc/bash/INTRO.gz"
$ echo ${fichier##*/}
INTRO.gz

Appliquée à un tableau, cette manipulation a bien lieu sur tous ses éléments :

$ tableau=( dossier_fry.txt dossier_leela.txt dossier_bender.txt dossier_farnsworth.txt )
$ echo ${tableau[@]#dossier_}
fry.txt leela.txt bender.txt farnsworth.txt

Suppression du motif correspondant au suffixe

${paramètre%mot}
${paramètre%%mot}

De même, la première forme enlève le plus court motif, et la seconde le plus long :

echo "${var%the world}everyone"
Good morning to everyone

On peut ainsi récupérer le répertoire où se trouve un fichier à partir de son chemin absolu (comme le fait la commande dirname) :

$ fichier="/usr/share/doc/bash/INTRO.gz"
$ echo ${fichier%/*}
/usr/share/doc/bash

Ou bien supprimer l’extention du nom d’un fichier (pour rappel, le point n’a pas de signification particulière dans les extensions de chemin de bash, contrairement aux expressions régulières) :

$ fichier="machin.txt"
$ echo ${fichier%.*}
machin

Sur un tableau, tous ses éléments sont transformés :

$ tableau=( fry.txt leela.txt bender.txt farnsworth.txt )
$ echo ${tableau[@]%.*}
fry leela bender farnsworth

Substitution de motif

${paramètre/motif/chaîne}

Appliqué à un tableau, on peut donc par exemple modifier un mot dans tous ses éléments en une seule opération :

$ tableau=( fry_and_bender.txt leela_and_fry.txt bender_versus_flexo.txt )
$ echo ${tableau[@]/bender/bender_the_best}
fry_and_bender_the_best.txt leela_and_fry.txt bender_the_best_versus_flexo.txt

Modification de la casse

Cette fonctionnalité nécessite bash 4 ou supérieur.

${paramètre^motif}
${paramètre^^motif}
${paramètre,motif}
${paramètre,,motif}

Le caractère ^ change les lettres en majuscules, et , en minuscules (pour le retenir, pensez à une flèche vers le haut pour les majuscules, et vers le bas pour les minuscules). Lorsqu’on double le caractère, toutes les lettres de la chaîne sont examinées, sinon seule la première lettre est affectée :

$ echo ${var,,}
hello to the world
$ echo ${var^^}
HELLO TO THE WORLD
$ var2="hello to the world"; echo ${var^}
Hello to the world

On peut également fournir un motif correspondant aux lettres dont la casse doit être changée (attention, il faut toujours doubler le caractère ^ ou , si on veut que ça n’agisse pas seulement sur la première lettre).

$ echo ${var^^[twl]}
HeLLo To The WorLd
~$ var3="hello"
~$ echo ${var3^[l]}
hello
~$ echo ${var3^^[l]}
heLLo

Et, comme toujours, on peut agir sur tous les éléments d’un tableau :

$ tableau=( fry leela bender farnsworth )
$ echo ${tableau[@]^}
Fry Leela Bender Farnsworth
$ echo ${tableau[@]^^}
FRY LEELA BENDER FARNSWORTH

Longueur d’une chaîne de caractères conservée dans une variable

Pour obtenir la longueur de la chaîne de caractères de notre exemple :

$ echo "${#var}"
18

Avec un tableau, cette opération renvoit le nombre d’éléments qu’il contient :

$ tableau=( fry leela bender farnsworth )
$ echo ${#tableau[@]}
4

Pour en savoir plus

Comme toujours, pour en savoir plus, lisez le manuel !

Celui de l’interpréteur bash est volumineux, mais il vous en apprendra beaucoup sur cet interpréteur. Les fonctions présentées ici sont détaillées dans la section « Remplacement des paramètres », en même temps d’autres fonctionnalités tout aussi intéressantes.