Совпадение регулярных выражений в Bash

ShellShellBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом руководстве вы познакомитесь с регулярными выражениями (regex) в Bash. Регулярные выражения - это мощный инструмент для поиска шаблонов в тексте. Изучив регулярные выражения, вы значительно улучшите свои навыки написания скриптов в оболочке, что позволит вам более эффективно обрабатывать текст, извлекать данные и автоматизировать задачи. Это руководство предназначено для начинающих, поэтому предыдущий опыт работы с регулярными выражениями не обязателен. Мы начнем с основ и постепенно расширим ваши знания.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL shell(("Shell")) -.-> shell/VariableHandlingGroup(["Variable Handling"]) shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) shell(("Shell")) -.-> shell/AdvancedScriptingConceptsGroup(["Advanced Scripting Concepts"]) shell(("Shell")) -.-> shell/SystemInteractionandConfigurationGroup(["System Interaction and Configuration"]) shell/VariableHandlingGroup -.-> shell/variables_decl("Variable Declaration") shell/VariableHandlingGroup -.-> shell/variables_usage("Variable Usage") shell/VariableHandlingGroup -.-> shell/str_manipulation("String Manipulation") shell/ControlFlowGroup -.-> shell/if_else("If-Else Statements") shell/ControlFlowGroup -.-> shell/cond_expr("Conditional Expressions") shell/AdvancedScriptingConceptsGroup -.-> shell/cmd_substitution("Command Substitution") shell/SystemInteractionandConfigurationGroup -.-> shell/globbing_expansion("Globbing and Pathname Expansion") subgraph Lab Skills shell/variables_decl -.-> lab-391551{{"Совпадение регулярных выражений в Bash"}} shell/variables_usage -.-> lab-391551{{"Совпадение регулярных выражений в Bash"}} shell/str_manipulation -.-> lab-391551{{"Совпадение регулярных выражений в Bash"}} shell/if_else -.-> lab-391551{{"Совпадение регулярных выражений в Bash"}} shell/cond_expr -.-> lab-391551{{"Совпадение регулярных выражений в Bash"}} shell/cmd_substitution -.-> lab-391551{{"Совпадение регулярных выражений в Bash"}} shell/globbing_expansion -.-> lab-391551{{"Совпадение регулярных выражений в Bash"}} end

Понимание основ регулярных выражений и сопоставления

Начнем с фундаментальных концепций регулярных выражений. Регулярное выражение - это последовательность символов, которая определяет шаблон поиска. Представьте его как очень мощный способ поиска текста.

Вот основные строительные блоки:

  • Литеральные символы: Большинство символов просто соответствуют сами себе. Например, регулярное выражение 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
Regex and Matching

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