Используем BASH_REMATCH или группы в регулярных выражениях

Опубликовано 8 дек. 2025 г.

Автор: 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 считает восьмеричными.

Для перфекционистов скажу, что данная регулярка не является строгой по отношению к датам, но в большинстве практических скриптов ее можно использовать.

Всем кода без багов.

Комментарии