Як працюють регулярні вирази у Bash: просте пояснення для початківців

24.10.2025 2 хвилин Автор: Lady Liberty

У цій статті ви дізнаєтеся, як використовувати регулярні вирази в Bash — простий і потужний спосіб перевіряти, знаходити та обробляти текст у скриптах. Матеріал пояснює, як працює команда [[ string =~ regex ]], що таке символьні класи, якірні символи та квантори, а також показує практичні приклади пошуку й виділення даних у рядках. Ви навчитеся використовувати BASH_REMATCH для збереження знайдених збігів, працювати з sed для заміни тексту та уникати типових помилок під час роботи з рядками.

Розуміння основних регулярних виразів та зіставлення

Почнемо з фундаментальних концепцій регулярних виразів. Регулярний вираз – це послідовність символів, яка визначає шаблон пошуку . Уявіть собі його як дуже потужний спосіб пошуку тексту.

Ось основні будівельні блоки:

Літеральні символи: Більшість символів просто збігаються самі з собою. Наприклад, регулярний вираз 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]відповідає будь-якому буквено-цифровому символу.

  • Заперечення: Якщо ви поставите a ^як перший символ всередині [], це заперечить клас. [^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

Висновок має вказувати на “Знайдено збіг!”. Це тому, що 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

Висновок має показувати “Знайдено збіг!”. Це тому, що ab+cзбігається з рядком, що починається з ‘a’, за яким іде одна або декілька ‘b’, і закінчується на ‘c’.

Вилучення даних за допомогою груп захоплення у скрипті

Дужки ()використовуються для групування частин регулярного виразу. Це корисно для застосування квантифікаторів до кількох символів та для захоплення збігів тексту.

Коли ви використовуєте дужки, Bash зберігає текст, який відповідає цій частині регулярного виразу, у спеціальному масиві під назвою BASH_REMATCHBASH_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

Висновок має містити “Фрукт: яблуко”. Цей скрипт витягує назву фрукта з рядка за допомогою груп захоплення.

Заміна тексту на 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”.

Висновок

Регулярні вирази в Bash — це зручний і потужний спосіб працювати з текстом прямо в командному рядку. Вони дозволяють не просто перевіряти рядки, а й витягувати потрібні частини, змінювати їх і автоматизувати повторювані дії у скриптах. Завдяки простим конструкціям — від символів і квантифікаторів до груп захоплення — можна швидко створювати шаблони, які працюють із будь-якими даними. А поєднання з sed відкриває ще більше можливостей для обробки тексту без складних інструментів.

Підписатися
Сповістити про
0 Коментарі
Найстаріші
Найновіше Найбільше голосів
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.