Введение
В этом руководстве вы познакомитесь с регулярными выражениями (regex) в Bash. Регулярные выражения - это мощный инструмент для поиска шаблонов в тексте. Изучив регулярные выражения, вы значительно улучшите свои навыки написания скриптов в оболочке, что позволит вам более эффективно обрабатывать текст, извлекать данные и автоматизировать задачи. Это руководство предназначено для начинающих, поэтому предыдущий опыт работы с регулярными выражениями не обязателен. Мы начнем с основ и постепенно расширим ваши знания.
Понимание основ регулярных выражений и сопоставления
Начнем с фундаментальных концепций регулярных выражений. Регулярное выражение - это последовательность символов, которая определяет шаблон поиска. Представьте его как очень мощный способ поиска текста.
Вот основные строительные блоки:
- Литеральные символы: Большинство символов просто соответствуют сами себе. Например, регулярное выражение
abcточно соответствует строке "abc". - Метасимволы: Это специальные символы, которые имеют особое значение в регулярных выражениях. Рассмотрим несколько ключевых из них:
.(точка): Соответствует любому одиночному символу (кроме перевода строки). Таким образом,a.cсоответствует "abc", "axc", "a1c" и так далее.*(звездочка): Соответствует предыдущему символу ноль или более раз.ab*cсоответствует "ac", "abc", "abbc", "abbbc" и т.д.^(каретка): Соответствует началу строки.^helloсоответствует строке, которая начинается с "hello".$(доллар): Соответствует концу строки.world$соответствует строке, которая заканчивается на "world".[](квадратные скобки): Определяет класс символов. Он соответствует любому одному из символов внутри скобок.[abc]соответствует "a", "b" или "c".[0-9]соответствует любой одиночной цифре.
Теперь создадим Bash-скрипт, чтобы проверить наше понимание. Создайте файл с именем regex_test.sh с помощью команды touch:
cd ~/project
touch regex_test.sh
Далее откройте regex_test.sh с помощью текстового редактора (например, nano или vim) и добавьте следующий код:
#!/bin/bash
string="Hello World"
if [[ "$string" =~ ^Hello ]]; then
echo "The string starts with Hello"
else
echo "The string does not start with Hello"
fi
Сохраните файл и сделайте его исполняемым:
chmod +x regex_test.sh
Наконец, запустите скрипт:
./regex_test.sh

Вывод должен показать, что строка начинается с "Hello".
Работа с наборами символов в скрипте
Наборы символов, определяемые с помощью квадратных скобок [], позволяют вам сопоставить один символ из определенной группы. Это очень полезно для создания более гибких шаблонов.
- Диапазоны символов: Внутри
[]можно использовать дефис (-), чтобы указать диапазон.[a-z]соответствует любой строчной букве,[A-Z]- любой заглавной букве, а[0-9]- любой цифре. Можно комбинировать их:[a-zA-Z0-9]соответствует любому алфавитно-цифровому символу. - Отрицание: Если поставить
^в качестве первого символа внутри[], это инвертирует класс.[^0-9]соответствует любому символу, который не является цифрой.
Давайте изменим наш скрипт regex_test.sh, чтобы использовать наборы символов. Откройте regex_test.sh в текстовом редакторе и замените его содержимое следующим:
#!/bin/bash
string="cat"
if [[ "$string" =~ c[a-z]t ]]; then
echo "Match found!"
else
echo "No match."
fi
Сохраните файл и запустите его:
./regex_test.sh
Вывод должен показать "Match found!". Это потому, что c[a-z]t соответствует любой трехбуквенной строке, начинающейся с 'c' и заканчивающейся на 't', где средний символ - это строчная буква.
Использование квантификаторов для повторения шаблонов в скрипте
Квантификаторы контролируют, сколько раз символ или группа символов должны повторяться. Это значительно расширяет возможности ваших регулярных выражений.
+(плюс): Соответствует предыдущему символу один или более раз.ab+cсоответствует "abc", "abbc", "abbbc" и т.д., но не "ac".?(знак вопроса): Соответствует предыдущему символу ноль или один раз (то есть делает предыдущий символ необязательным).ab?cсоответствует "ac" и "abc", но не "abbc".*(звездочка): Соответствует предыдущему символу ноль или более раз. Мы уже видели это ранее.{n}: Соответствует предыдущему символу ровно n раз.a{3}соответствует "aaa".{n,}: Соответствует предыдущему символу n или более раз.a{2,}соответствует "aa", "aaa", "aaaa" и т.д.{n,m}: Соответствует предыдущему символу от n до m раз (включительно).a{1,3}соответствует "a", "aa" или "aaa".
Давайте изменим наш скрипт regex_test.sh, чтобы использовать квантификаторы. Откройте regex_test.sh в текстовом редакторе и замените его содержимое следующим:
#!/bin/bash
string="abbbc"
if [[ "$string" =~ ab+c ]]; then
echo "Match found!"
else
echo "No match."
fi
Сохраните файл и запустите его:
./regex_test.sh
Вывод должен показать "Match found!". Это потому, что ab+c соответствует строке, начинающейся с 'a', за которой следует один или более символов 'b', и заканчивающейся на 'c'.
Извлечение данных с помощью захватывающих групп в скрипте
Скобки () используются для группировки частей регулярного выражения. Это полезно для применения квантификаторов к нескольким символам и для захвата совпавшего текста.
При использовании скобок Bash сохраняет текст, совпавший с этой частью регулярного выражения, в специальный массив BASH_REMATCH. BASH_REMATCH[0] содержит всю совпавшую строку, BASH_REMATCH[1] - текст, совпавший с первой группой, BASH_REMATCH[2] - со второй и так далее.
Давайте изменим наш скрипт regex_test.sh, чтобы извлекать данные с помощью захватывающих групп. Откройте regex_test.sh в текстовом редакторе и замените его содержимое следующим:
#!/bin/bash
string="apple123"
if [[ "$string" =~ ^([a-z]+)([0-9]+)$ ]]; then
fruit="${BASH_REMATCH[1]}"
number="${BASH_REMATCH[2]}"
echo "Fruit: $fruit"
else
echo "No match."
fi
Сохраните файл и запустите его:
./regex_test.sh
Вывод должен содержать "Fruit: apple". Этот скрипт извлекает название фрукта из строки с помощью захватывающих групп.
Замена текста с помощью sed в скрипте
Давайте создадим новый скрипт с именем sed_test.sh, чтобы потренироваться в использовании sed.
cd ~/project
touch sed_test.sh
chmod +x sed_test.sh
Откройте sed_test.sh в текстовом редакторе и добавьте следующее:
#!/bin/bash
string="apple123"
echo "$string" | sed 's/[0-9]/X/g'
Сохраните файл и запустите его:
./sed_test.sh
Вывод должен быть: appleXXX. Этот скрипт использует sed для замены всех цифр в строке на букву "X".
Резюме
В этом руководстве вы познакомились с регулярными выражениями (regex) в Bash. Вы узнали о базовых концепциях регулярных выражений, классах символов, квантификаторах, группировке, захвате и о том, как использовать регулярные выражения с sed. Писанием и выполнением скриптов на Bash вы приобрели практический опыт работы с этими мощными инструментами. Не забудьте практиковаться и экспериментировать с разными шаблонами регулярных выражений, чтобы закрепить свои знания.



