Manipulation des chaînes de caractères et des tableaux en bash
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
- Précisions sur cette documentation
- Récupérer un sous-ensemble d’une chaîne de caractères
- Suppression du motif correspondant au préfixe
- Suppression du motif correspondant au suffixe
- Substitution de motif
- Modification de la casse
- Longueur d’une chaîne de caractères conservée dans une variable
- Pour en savoir plus
Précisions sur cette documentation
-
les motifs utilisés dans les fonctionnalités présentées ci-dessous sont les mêmes que ceux utilisés par bash dans les développements de chemin.
-
avant chacun des exemples ci-dessous, on suppose qu’une variable
var
est définie ainsi :var="Hello to the world"
-
pour appliquer les modifications de chaîne de caractères à tous les éléments d’un tableau, il suffit de passer le contenu de ce tableau sous la forme
tableau[@]
à la place du nom de la variable contenant une chaîne de caractère, fourni commeparamètre
. Si le tableau est désigné par les caractères@
ou*
, la fonction agira sur la liste des arguments du script ou de la fonction. Des exemples spécifiques aux tableaux sont donnés pour illustrer le comportement spécifique de la fonctionnalité sur les tableaux.
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}
- si
motif
commence par un/
(c’est à dire si le premier/
est doublé), toutes les correspondances sont remplacées, sinon seule la première l’est ; - si
motif
commence par#
, il doit correspondre au début de la chaîne ; - si
motif
commence par%
, il doit correspondre à la fin de la chaîne ; - si
chaîne
est vide, les portions correspondant au motif sont supprimés et le/
qui suitmotif
peut être omis.
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.