В этом руководстве вы познакомитесь с регулярными выражениями (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 вы приобрели практический опыт работы с этими мощными инструментами. Не забудьте практиковаться и экспериментировать с разными шаблонами регулярных выражений, чтобы закрепить свои знания.
We use cookies for a number of reasons, such as keeping the website reliable and secure, to improve your experience on our website and to see how you interact with it. By accepting, you agree to our use of such cookies. Privacy Policy