Используем BASH_REMATCH или группы в регулярных выражениях
Автор: TagdTagd
Сегодня затронем довольно сложную тему bash: Использование групп в регулярных выражениях.
ЧИТАТЬ ПЕРВЫМ В ТЕЛЕГРАМ ЧИТАТЬ ПЕРВЫМ В MAX
Обычно для регулярок используют grep. Он очень функциональный и быстрый, но иногда использование встроенных в bash регулярок может здорово упростить скрипты. Приведу простой пример:
#!/bin/bash
declare PREF="FILE"
#создаем 10 файлов с "плавающим" префиксом
for FILE in "202512"{01..10};do
touch ${PREF:$RANDOM%4}${FILE}".txt"
done
# Выбираем только файлы с префиксом из двух или трех символов и "даты"
for FILE in *;do
if [[ $FILE =~ (.{2,3})([0-9]{4})([0-9]{2})([0-9]{2}) ]];then
# echo $FILE
declare -p BASH_REMATCH
fi
done
Первый for создает 10 тестовых файлов c «случайным» префиксом (1-4 последние буквы слова FILE).
Второй for — основной выбирает нужные нам файлы. А что именно нам нужно — задает регулярное выражение.
Разберем подробнее:
(.{2,3})([0-9]{4})([0-9]{2})([0-9]{2})
Обратите внимание — регулярку нельзя заключать в кавычки, иначе она превратиться в тыкву строку.
Напомню:
.- заменяет любой символ, кроме перевода строки
{2,3}- определяет количество захватываемых символов
[0-9]- любой символ в диапазоне 0-9
()- захватываемая группа
Первая группа (.{2,3}) — Захватывает от 2 до 3 любых символов {2,3} указывает минимальное и максимальное количество.
Вторая группа ([0-9]{4}) — Захватывает ровно 4 цифры (0–9).
Третья и четвёртая группы ([0-9]{2})([0-9]{2}): Каждая захватывает ровно 2 цифры.
И теперь самое главное:
Если строка (в данном случае имя файла) соответствует regexp - захваченный результат помещается в массив BASH_REMATCH с индексом 0
Все остальные группы помещаются в следующие элементы массива. Получаем что-то типа:
declare -a BASH_REMATCH=([0]="LE20251204" [1]="LE" [2]="2025" [3]="12" [4]="04")
...
По итогу — с помощью одного if мы получили: Префикс файла (1), год (2), месяц (3) и день (4).
Ну, на всякий случай напомню, если вдруг решите дни или месяцы использовать в математических операциях — придется избавиться от ведущих нулей, поскольку числа, начинающиеся на «0» bash считает восьмеричными.
Для перфекционистов скажу, что данная регулярка не является строгой по отношению к датам, но в большинстве практических скриптов ее можно использовать.
Всем кода без багов.