From 3e10720fc53e9f0a268ab49fa09cf7b326718583 Mon Sep 17 00:00:00 2001 From: jf Date: Mon, 16 Mar 2026 17:58:14 +0100 Subject: [PATCH] bash_rematch --- docs/Linux/2025-05-20-bash-life.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/Linux/2025-05-20-bash-life.md b/docs/Linux/2025-05-20-bash-life.md index 42c8114..886fcaf 100644 --- a/docs/Linux/2025-05-20-bash-life.md +++ b/docs/Linux/2025-05-20-bash-life.md @@ -13,3 +13,26 @@ date: 20-05-2025 set -euo pipefail IFS=$'\n\t' ``` + +## BASH_REMATCH et les tests de regex `=~` avec l'opérateur conditionnel `[[`: +[BASH_REMATCH special variable](https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#index-BASH_005fREMATCH) + +Lors d'un test de regex avec du type `if [[ ${variable} =~ ${pattern} ]]`, tous les résultats qui "matchent" le pattern sont stockés dans un variable spéciale `BASH_REMATCH`, qui est en fait un array. On peut donc itérer dessus. + +Exemple : +```bash +var="un velo" +pattern='(u[a-z]+)\s*(v[a-z]+)' + +if [[ $var =~ $pattern ]]; then + for m in "${!BASH_REMATCH[@]}"; do + echo "$m: ${BASH_REMATCH[$m]}" + done +fi +``` +Résultat: +```txt +0: un velo +1: un +2: velo +``` \ No newline at end of file