В BASH версии 3.0 и выше имеется специальный оператор для работы с регулярными выражениями =~.
Для примера возьмём такой скрипт:
#!/usr/bin/env bash PATH="/var/lib/mysql/rtfm_db1/*" regex=".*.MYI" for file in $PATH; do if [[ $file =~ $regex ]]; then echo -e "Found file: $file" fi done
Результат:
$ ./reg.sh Found file: /var/lib/mysql/rtfm_db1/db1_commentmeta.MYI Found file: /var/lib/mysql/rtfm_db1/db1_comments.MYI Found file: /var/lib/mysql/rtfm_db1/db1_links.MYI ... Found file: /var/lib/mysql/rtfm_db1/db1_usermeta.MYI Found file: /var/lib/mysql/rtfm_db1/db1_users.MYI
Результат проверкирегулярного выржения хранится в переменной BASH_REMATCH
. Т.е. скрипт можно переписать так:
#!/usr/bin/env bash PATH="/var/lib/mysql/rtfm_db1/*" regex=".*.MYI" for file in $PATH; do if [[ $file =~ $regex ]]; then echo -e "Found file: $BASH_REMATCH" fi done
И даже больше – массивом:
#!/usr/bin/env bash PATH="/var/lib/mysql/rtfm_db1/*" regex=".*.MYI" for file in $PATH; do if [[ $file =~ $regex ]]; then echo -e "Found file: ${BASH_REMATCH[@]}" fi done
В данном случае – массив будет хранить только один элемент:
#!/usr/bin/env bash PATH="/var/lib/mysql/rtfm_db1/*" regex=".*.MYI" for file in $PATH; do if [[ $file =~ $regex ]]; then # выводим кол-во элемента массива echo -e "Found file: ${#BASH_REMATCH[@]}" fi done
$ ./reg.sh Found file: 1 Found file: 1 Found file: 1
Смысл массива становится более понятен, если мы используем скобки в регулярном выражении для получения (или “захвата”) каких-то данных, например:
#!/usr/bin/env bash PATH="/var/lib/mysql/rtfm_db1/*" # добавляем захват значения regex="db1_(.*).MYI" for file in $PATH; do if [[ $file =~ $regex ]]; then # выводим количество элементов массива echo -e "Number of BASH_REMATCH array elements: ${#BASH_REMATCH[@]}" # вся строка, которая попала под фильтр регулярного выражения - первый (индекс 0) элемент массива echo -e "Full capture string: ${BASH_REMATCH[0]}" # второй элемент массива (индекс 1) - захваченное () в регулярном выражении значение echo -e "Captured string element: ${BASH_REMATCH[1]}" fi done
Результат:
$ ./reg.sh Number of BASH_REMATCH array elements: 2 Full capture string: db1_commentmeta.MYI Captured string element: commentmeta ... Number of BASH_REMATCH array elements: 2 Full capture string: db1_users.MYI Captured string element: users