Bash Scripting

Покорение сопоставления шаблонов в Bash

Spread the love

Регулярные выражения с оператором =~

Оператор =~ в Bash позволяет использовать мощные регулярные выражения. Регулярные выражения предлагают гораздо большую гибкость, чем простое сопоставление с подстановочными знаками, позволяя определять сложные шаблоны для обработки и проверки строк. Оператор возвращает true, если строка слева соответствует регулярному выражению справа, которое должно быть заключено в двойные кавычки.


string="This is a test string with 123 digits"

if [[ "$string" =~ "test" ]]; then
  echo "Строка содержит 'test'"
fi

if [[ "$string" =~ "string$" ]]; then  # $ соответствует концу строки
  echo "Строка заканчивается на 'string'"
fi

if [[ "$string" =~ "[0-9]+" ]]; then  # Соответствует одной или более цифрам
  echo "Строка содержит цифры"
fi

if [[ "$string" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$ ]]; then
  echo "Строка похожа на адрес электронной почты"
fi
  

Приведённые выше примеры демонстрируют базовое использование регулярных выражений. Для более сложных шаблонов обратитесь к подробному руководству или справочнику по регулярным выражениям. Гибкость регулярных выражений делает их идеальными для таких задач, как проверка адресов электронной почты, IP-адресов или других структурированных данных в строках.

Подстановочные знаки с оператором *

Подстановочный знак *, более простой, чем регулярные выражения, соответствует нулю или более символам. Он часто используется в сопоставлении файлов и базовых условных проверках. Хотя он менее мощный, он эффективен для простых сценариев.


files=(*.txt)  # Развертывается в список всех файлов .txt

if [[ "$filename" == "*.log" ]]; then
  echo "Это лог-файл"
fi

if [[ "$variable" == "pre*suf" ]]; then
  echo "Переменная начинается с 'pre' и заканчивается на 'suf'"
fi
  

Первый пример демонстрирует сопоставление файлов; другие демонстрируют базовое сопоставление шаблонов в условных операторах. Обратите внимание, что для сопоставления с подстановочными знаками используется ==, а не =~.

Извлечение подшаблонов

И регулярные выражения, и подстановочные знаки могут извлекать части совпадающей строки, хотя методы значительно различаются.

Регулярные выражения (с =~)

Регулярные выражения используют группы захвата, определяемые с помощью круглых скобок (), для выделения определённых частей совпадающей строки. Эти группы захвата доступны через массив BASH_REMATCH.


string="My user ID is 12345"
if [[ "$string" =~ "ID is ([0-9]+)" ]]; then
  user_id="${BASH_REMATCH[1]}"
  echo "Идентификатор пользователя: $user_id"
fi
  

([0-9]+) захватывает одну или более цифр, которые хранятся в ${BASH_REMATCH[1]}.

Подстановочные знаки (с *)

Сопоставление с подстановочными знаками не поддерживает прямое извлечение подшаблонов. Вместо этого вам нужно использовать методы обработки строк после базового сопоставления.


filename="my_report_2024-10-26.txt"
if [[ "$filename" == "my_report_*.txt" ]]; then
  date="${filename%.*}"  # Удаление расширения '.txt'
  date="${date##*_}"     # Удаление всего до последнего '_'
  echo "Дата отчёта: $date"
fi
  

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

Bash предлагает универсальные возможности сопоставления шаблонов. Выберите метод — регулярные выражения или подстановочные знаки — который наилучшим образом соответствует вашим потребностям, балансируя мощность и простоту.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *