Retour au cours

strings

Objectifs

  • Mesurer la longueur d’une chaîne de caractères.
  • Extraire des sous-chaînes (substrings).
  • Supprimer des préfixes ou des suffixes (très utile pour les noms de fichiers).
  • Chercher et remplacer des motifs simples.
  • Modifier la casse (majuscules/minuscules).
  • Formater des sorties proprement avec printf.

Explications détaillées

Notions clés

Bash offre des mécanismes puissants pour manipuler des chaînes de caractères directement dans le shell, sans avoir besoin d’outils externes comme sed ou awk pour des opérations simples. Ces opérations sont appelées “expansions de paramètres”.

Longueur d’une chaîne

  • ${#variable} : Donne le nombre de caractères dans la variable.

Extraction de sous-chaîne (Substring)

  • ${variable:offset:longueur} : Extrait une sous-chaîne.
    • offset : La position de départ (commence à 0).
    • longueur : Le nombre de caractères à extraire (optionnel).

Suppression de préfixes et suffixes

C’est l’une des utilisations les plus pratiques, notamment pour manipuler des chemins de fichiers. Les motifs utilisés sont des “glob patterns” (*, ?, []), pas des expressions régulières.

  • ${variable#motif} : Supprime le plus court préfixe correspondant au motif.
  • ${variable##motif} : Supprime le plus long préfixe.
  • ${variable%motif} : Supprime le plus court suffixe.
  • ${variable%%motif} : Supprime le plus long suffixe.

Remplacement de motifs

  • ${variable/motif/remplacement} : Remplace la première occurrence du motif.
  • ${variable//motif/remplacement} : Remplace toutes les occurrences.

Modification de la casse (Bash 4+)

  • ${variable,,} : Convertit toute la chaîne en minuscules.
  • ${variable^^} : Convertit toute la chaîne en majuscules.
  • ${variable,} : Convertit la première lettre en minuscule.
  • ${variable^} : Convertit la première lettre en majuscule.

printf : Un echo surpuissant

printf est une commande qui permet de formater des chaînes de manière contrôlée et portable.

printf "format" arg1 arg2 ...

  • %s : chaîne de caractères
  • %d : nombre entier
  • %f : nombre flottant
  • \n : saut de ligne (contrairement à echo, printf n’en ajoute pas par défaut).

Syntaxe / Usages

CHAINE="Bonjour le monde"
echo "Longueur : ${#CHAINE}" # -> 17

# Extraction
echo "${CHAINE:8:2}" # -> "le"

# Suppression de suffixe
FICHIER="rapport.final.txt"
echo "${FICHIER%.*}"   # -> rapport.final (plus court suffixe *. )
echo "${FICHIER%%.*}"  # -> rapport (plus long suffixe *. )

# Remplacement
echo "${CHAINE//o/0}" # -> B0nj0ur le m0nde

# Casse
echo "${CHAINE^^}" # -> BONJOUR LE MONDE

# Formatage avec printf
printf "Utilisateur: %-15s | Age: %d\n" "Alice" 30
printf "Utilisateur: %-15s | Age: %d\n" "Bob" 4
# %-15s : chaîne, alignée à gauche sur 15 caractères

Exemples

# 1. Extraire le nom de fichier et son extension
CHEMIN_COMPLET="/home/user/documents/archive.tar.gz"

nom_fichier="${CHEMIN_COMPLET##*/}" # Supprime le plus long préfixe */
extension="${nom_fichier##*.}"      # Supprime le plus long préfixe *
nom_base="${nom_fichier%%.*}"      # Supprime le plus long suffixe *

echo "Fichier : $nom_fichier"
echo "Extension : $extension"
echo "Nom de base : $nom_base"

# 2. Créer un "slug" pour une URL
TITRE_ARTICLE="Les dernières nouvelles du monde !"
slug="${TITRE_ARTICLE// /_}" # Remplace les espaces par des underscores
slug="${slug//\!/}"         # Supprime les points d'exclamation
slug="${slug,,}"            # Met tout en minuscules
echo "Slug : $slug"

Bonnes pratiques

  • Privilégiez les expansions de paramètres (${...}) pour les manipulations simples. Elles sont beaucoup plus rapides que de lancer un processus externe comme sed.
  • Utilisez printf dans vos scripts pour un contrôle total sur la sortie. C’est plus portable et plus sûr que echo.
  • Mettez les accolades ({...}) autour du nom de vos variables dès qu’il y a une ambiguïté potentielle avec le caractère qui suit (echo "${VAR}_suffixe").

Pièges courants

  • Confondre globbing et regex : Les motifs de suppression/remplacement (#, %, /) utilisent la syntaxe “glob”, pas des expressions régulières complètes.
  • Espaces dans les printf : printf est sensible aux espaces dans sa chaîne de format.
  • echo et les tirets : VAR="-n"; echo $VAR peut être interprété par echo comme une option. printf "%s\n" "$VAR" n’a pas ce problème.

Exercices

  1. Manipulation de chemin :

    • Étant donné une variable FICHIER="/var/log/nginx/access.log.1.gz".
    • Extraire le nom du fichier (access.log.1.gz).
    • Extraire le nom du dossier (/var/log/nginx).
    • Extraire la dernière extension (gz).
  2. Nettoyage de chaîne :

    • Écrivez un script qui prend une phrase en argument.
    • Il doit la mettre en minuscules, remplacer tous les espaces par des tirets -, et supprimer tous les caractères qui ne sont pas des lettres, des chiffres ou des tirets.
  3. Tableau formaté :

    • Créez un script qui affiche un petit tableau de 3 lignes et 2 colonnes en utilisant printf pour que les colonnes soient parfaitement alignées.
    • Exemple :
      Nom         | Rôle
      ------------|-----------
      Alice       | Admin
      Bob         | Utilisateur