Регулярные выражения с оператором =~
Оператор =~
в 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 предлагает универсальные возможности сопоставления шаблонов. Выберите метод — регулярные выражения или подстановочные знаки — который наилучшим образом соответствует вашим потребностям, балансируя мощность и простоту.