Bash Scripting

Maîtriser la correspondance de motifs sous Bash

Spread the love

Expressions régulières avec l’opérateur =~

L’opérateur =~ de Bash permet des correspondances d’expressions régulières puissantes. Les expressions régulières offrent une flexibilité bien supérieure à la simple correspondance avec les caractères génériques, vous permettant de définir des motifs complexes pour la manipulation et la validation de chaînes de caractères. L’opérateur renvoie vrai si la chaîne à gauche correspond à l’expression régulière à droite, qui doit être entre guillemets doubles.


string="Ceci est une chaîne de test avec 123 chiffres"

if [[ "$string" =~ "test" ]]; then
  echo "La chaîne contient 'test'"
fi

if [[ "$string" =~ "chaîne$" ]]; then  # $ correspond à la fin de la chaîne
  echo "La chaîne se termine par 'chaîne'"
fi

if [[ "$string" =~ "[0-9]+" ]]; then  # Correspond à un ou plusieurs chiffres
  echo "La chaîne contient des chiffres"
fi

if [[ "$string" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$ ]]; then
  echo "La chaîne ressemble à une adresse e-mail"
fi
  

Les exemples ci-dessus montrent l’utilisation de base des expressions régulières. Pour des motifs plus complexes, consultez un tutoriel ou une référence complète sur les expressions régulières. La flexibilité des expressions régulières les rend idéales pour des tâches telles que la validation d’adresses e-mail, d’adresses IP ou d’autres données structurées dans les chaînes.

Correspondance avec les caractères génériques et l’opérateur *

Le caractère générique *, plus simple que les expressions régulières, correspond à zéro ou plusieurs caractères. Il est fréquemment utilisé dans la gestion des fichiers et les vérifications conditionnelles de base. Bien que moins puissant, il est efficace pour les scénarios simples.


fichiers=(*.txt)  # Développé en une liste de tous les fichiers .txt

if [[ "$nomfichier" == "*.log" ]]; then
  echo "Ceci est un fichier journal"
fi

if [[ "$variable" == "pre*suf" ]]; then
  echo "La variable commence par 'pre' et se termine par 'suf'"
fi
  

Le premier exemple montre la gestion des fichiers ; les autres montrent la correspondance de motifs de base dans les instructions conditionnelles. Notez que ==, et non =~, est utilisé pour la correspondance avec les caractères génériques.

Extraction de sous-motifs

Les expressions régulières et les caractères génériques peuvent extraire des parties d’une chaîne correspondante, bien que les méthodes diffèrent considérablement.

Expressions régulières (avec =~)

Les expressions régulières utilisent des groupes de capture, définis avec des parenthèses (), pour isoler des parties spécifiques de la chaîne correspondante. Ces groupes capturés sont accessibles via le tableau BASH_REMATCH.


string="Mon ID utilisateur est 12345"
if [[ "$string" =~ "ID est ([0-9]+)" ]]; then
  id_utilisateur="${BASH_REMATCH[1]}"
  echo "ID utilisateur : $id_utilisateur"
fi
  

([0-9]+) capture un ou plusieurs chiffres, stockés dans ${BASH_REMATCH[1]}.

Caractères génériques (avec *)

La correspondance avec les caractères génériques ne prend pas directement en charge l’extraction de sous-motifs. Au lieu de cela, vous avez besoin de techniques de manipulation de chaînes après une correspondance de base.


nomfichier="mon_rapport_2024-10-26.txt"
if [[ "$nomfichier" == "mon_rapport_*.txt" ]]; then
  date="${nomfichier%.*}"  # Supprime l'extension '.txt'
  date="${date##*_}"     # Supprime tout avant le dernier '_'
  echo "Date du rapport : $date"
fi
  

Cet exemple utilise le développement de paramètres pour réaliser l’extraction de sous-motifs, démontrant une approche moins élégante mais efficace pour les scénarios plus simples.

Bash offre des capacités de correspondance de motifs polyvalentes. Choisissez la méthode — expressions régulières ou caractères génériques — qui convient le mieux à vos besoins, en équilibrant puissance et simplicité.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *