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

    Команда Simple-Server
    03.06.2026
    11 мин

    Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

    Что такое регулярные выражения?

    Регулярные выражения — это специальным образом записанные строки, используемые для поиска символьных шаблонов в тексте. Чем-то они похожи на групповые символы в оболочке, но их возможности куда шире. Многие утилиты для работы с текстом в Linux и языки программирования включают в себя механизм регулярных выражений. Здесь возникают проблемы: разные программы и языки оперируют различными диалектами регулярных выражений. В этой статье рассмотрим стандарт POSIX, которому соответствуют большинство утилит в Linux.

    Программа grep — это основной инструмент для работы с регулярными выражениями. Grep анализирует данные со стандартного ввода, ищет совпадения с указанным шаблоном и выводит все подходящие строки. Обычно grep предустановлен в большинстве дистрибутивов. Если хотите потренироваться в использовании регулярных выражений, можете повторять описанные команды в виртуальной машине, либо на арендованном сервере.

    Grep имеет следующий синтаксис:

    grep [параметры] регулярное_выражение [файл…]

    Самый простой случай использования grep — поиск строк, содержащих фиксированную подстроку. В следующем примере grep вывел все строки, содержащие последовательность nologin:

    grep nologin /etc/passwd Output: daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin games:x:5:60:games:/usr/games:/usr/sbin/nologin ...

    У grep имеются множество параметров. Подробно с ними ознакомиться можно в документации. Приведем ключи, полезные при работе с регулярными выражениями:

    Ключ -v — инвертировать критерий. В этом случае grep выводит строки, не содержащие совпадений:

    ls /bin | grep -v zip Output: [ 411toppm 7z 7za 7zr …

    Ключ -i — игнорировать регистр символов.

    Ключ -o — выводить не строки, а только совпадения с шаблоном:

    ls /bin | grep -o zip Output: zip zip zip zip …

    Ключ -w — искать только строки, содержащие все слово, которое составляет шаблон.

    ls /bin | grep -w zip Output: gpg-zip zip

    Для сравнения та же команда без опции. В вывод также попали строки, содержащие шаблон в качестве подслова в слове.

    ls /bin | grep zip Output bunzip2 bzip2 bzip2recover funzip ...

    Basic Regular Expressions

    Ранее упоминалось, что существует множество диалектов регулярных выражений. В стандарте POSIX рассматриваются два вида реализаций. Первый — Basic Regular Expressions (BRE). Ему соответствуют практически все POSIX-совместимые программы. Второй — Extended Regular Expression (ERE). Этот вид позволяет создавать более сложные регулярные выражения, но поддерживается не всеми утилитами. Для начала рассмотрим особенности BRE.

    В тексте выше мы уже столкнулись с простыми регулярными выражениями. К примеру, выражение «zip» обозначает строку, соответствующую следующим критериям: в строке не меньше трех символов; в строке присутствуют символы «z», «i», «p», причем именно в таком порядке; между ними нет других символов. Символы, соответствующие сами себе (как «z», «i», «p») называются литералами. Кроме того, существуют другая категория символов, называемая метасимволами. Они применяются для составления различных критериев поиска. К метасимволам в BRE относятся:

    Чтобы использовать метасимвол в качестве литерала, его нужно экранировать с помощью обратного слэша (\). Обратите внимание, что некоторые метасимволы имеют специальное значение в оболочке. Поэтому при передаче регулярного выражения в аргумент команды его следует заключать в кавычки.

    Метасимвол «точка» (.) соответствует любому символу в данной позиции. Например:

    ls /bin | grep '.zip' Output: bunzip2 bzip2 bzip2recover funzip gpg-zip gunzip gzip mzip p7zip pbzip2 preunzip prezip prezip-bin streamzip unzip unzipsfx

    Здесь имеется один важный момент. Программа zip не вошла в вывод, так как метасимвол «точка» увеличил длину обязательного совпадения до четырех символов.

    Символ «карет» (^) и «доллар» ($) в регулярных выражениях играют роль якорей. Это означает, что в их присутствии совпадение с шаблоном возможно, только если оно будет найдено в начале строки (^) или в ее конце ($).

    ls /bin | grep '^zip' Output: zip zipcloak zipdetails zipgrep … ls /bin | grep ‘zip$’ Output: funzip gpg-zip gunzip … ls /bin | grep ‘^zip$’ Output zip

    Регулярное выражение ^$ будет соответствовать пустым строкам.

    Кроме описания совпадения с любым символом в заданной позиции (.) в регулярных выражениях имеется возможность описать символ из определенного множества. Делается это с помощью квадратных скобок. В следующем примере ищутся соответствия со строками bzip и gzip:

    ls /bin | grep '[bg]zip' Output: bzip2 bzip2recover gzip

    Все метасимволы, кроме двух, теряют свое специальное значение внутри скобок.

    Если сразу после открывающей квадратной скобки стоит символ карет (^), остальные символы множества интерпретируются как недопустимые в данной позиции. Например:

    ls /bin | grep '[^bg]zip' Output: bunzip2 funzip gpg-zip gunzip mzip p7zip preunzip prezip prezip-bin streamzip unzip unzipsfx

    Включив отрицание, мы получили список имен файлов, содержащих последовательность zip, которой предшествуют любой символ, кроме b или g. Обратите внимание, что имя zip не было найдено. Символ отрицания не отменяет необходимости присутствия символа в заданной позиции. Кроме того символ карет является отрицанием, только если стоит сразу же после открывающей скобки; в противном случае он теряет свое специальное значение.

    С помощью дефиса (-) можно определять диапазоны символов. Так можно выразить любой диапазон символов и даже нескольких таких диапазонов. К примеру нам нужно найти все имена файлов, начинающиеся с буквы или цифры. Делается это так:

    ls ~ | grep '^[A-Za-z0-9]' Output: backup bin Books Desktop docker Documents Downloads GNS3 …

    При использовании диапазонов символов существует одна проблема. Диапазоны трактуются по-разному в зависимости от настроек локали. Например, в некоторых ситуациях диапазон [A-Z] интерпретируется в лексикографическом порядке, то есть он включает все алфавитные символы, кроме символа a в нижнем регистре. Для решения этой проблемы в стандарте POSIX придумали несколько классов, описывающих разные множества символов. Некоторые из них:

    • [:alnum:] — Алфавитно-цифровые символы; эквивалент диапазона [A-Za-z0-9] в ASCII.
    • [:alpha:] — Алфавитные символы; эквивалент диапазона [A-Za-z] в ASCII.
    • [:digit:] — Цифры от 0 до 9.
    • [:lower:] и [:upper:] — Символы нижнего и верхнего регистра соответственно.
    • [:space:] — Пробельные символы, включая пробел, табуляцию, возврат каретки, перевод строки, вертикальную табуляцию и перевод формата.

    Наличие классов символов не дает удобного способа выражения частичных диапазонов, таких как [A-M]. Пример использования:

    ls ~ | grep '[[:upper:]].*' Output: Books Desktop Documents Downloads GNS3 GOG Games Learning Music ...

    Extended Regular Expressions

    Особенности, рассматривавшиеся выше, поддерживаются практически всем POSIX-совместимыми приложениями и приложениями, реализующими BRE (например grep и потоковый редактор sed). Стандарт POSIX ERE позволяет создавать более выразительные регулярные выражения, однако не все программы умеют с ним работать. Диалект ERE поддерживался программой egrep, но GNU-версия grep также поддерживает расширенные регулярные выражения при вызове с ключом -E.

    В ERE множество метасимволов расширяются следующими:

    Чередование позволяет выбирать совпадение с одним из нескольких выражений. Так же как выражения в квадратных скобках позволяют одному символу соответствовать множеству указанных символов, чередование позволяет находить совпадение с множеством строки или других регулярных выражений. Чередование обозначается метасимволом вертикальной черты:

    echo "AAA" | grep -E 'AAA|BBB' Output: AAA echo "BBB" | grep -E 'AAA|BBB' Output: BBB echo "CCC" | grep -E 'AAA|BBB'

    Элементы регулярных выражений можно объединять и ссылаться на них как на один элемент. Делается это с помощью круглых скобок.

    Следующее выражение будет соответствовать именам файлов, начинающихся с bz, gz или zip. Если отбросить круглые скобки, смысл регулярного выражения изменится, и ему будут соответствовать имена, начинающиеся с bz или содержащие gz, или zip.

    ls /bin | grep -E '^(bz|gz|zip)' Output: bzcat bzgrep bzip2 bzip2recover bzless bzmore gzexe gzip zip zipdetails zipgrep zipinfo zipsplit

    Квантификаторы позволяют определить число совпадений с элементом. BRE поддерживают несколько способов.

    Квантификатор ? означает совпадение с элементом ноль или один раз. Иными словами совпадение с предыдущим элементом необязательно:

    echo "tet" | grep -E 'tes?t' Output: tet echo "test" | grep -E 'tes?t' Output: test echo "tesst" | grep -E 'tes?t' Output:

    В последнем случае совпадения не найдены, так как буква «s» встретилась дважды.

    Подобно метасимволу ?, звездочка (*) обозначает необязательный элемент; однако, в отличие от знака вопроса, этот элемент может встречаться любое число раз, а не только единожды. Рассмотрим предыдущий пример, используя вместо знака вопроса звездочку:

    echo "tet" | grep -E 'tes*t' Output: tet echo "test" | grep -E 'tes*t' Output: test echo "tesst" | grep -E 'tes*t' Output: tesst

    На этот раз все три строки совпали с шаблоном.

    Метасимвол + действует почти так же, как *, но требует совпадения с предыдущим элементом не менее одного раза:

    echo "tet" | grep -E 'tes+t' Output: echo "test" | grep -E 'tes+t' Output: test echo "tesst" | grep -E 'tes+t' Output: tesst

    Теперь с шаблоном не совпала первая строка, так как метасимвол + требует хотя бы одного совпадения с предыдущим элементом.

    В BRE существуют специальные метасимволы { и }, которые, в отличие от предыдущих квантификаторов, позволяют выразить минимальное и максимальное число обязательных совпадений. Всего существует четыре возможных способа задания числа совпадений:

    • {n} — Совпадение, если предыдущий элемент встречается точно n раз.
    • {n,m} — Совпадение, если предыдущий элемент встречается не менее n и не более m раз.
    • {n,} — Совпадение, если предыдущий элемент встречается n или более раз.
    • {,m} — Совпадение, если предыдущий элемент встречается не более m раз.
    echo "tet" | grep -E "tes{1,3}t" Output: echo "test" | grep -E "tes{1,3}t" Output: test echo "tesst" | grep -E "tes{1,3}t" Output: tesst echo "tessst" | grep -E "tes{1,3}t" Output: tessst echo "tesssst" | grep -E "tes{1,3}t" Output:

    С шаблоном совпали только те строки, где буква s встречается один, два или три раза.

    Регулярные выражения на практике

    В качестве заключения рассмотрим пару примеров, как регулярные выражения могут использоваться на практике.

    Проверка номеров телефонов

    Допустим, у нас имеется список номеров телефонов. Корректный формат номера: (nnn) nnn-nnnn. В списке 10 номеров, три номера имеют некорректный формат.

    cat phonenumbers.txt Output: (185) 136-1035 (95) 213-1874 (37) 207-2639 (285) 227-1602 (275) 298-1043 (107) 204-2197 (799) 240-1839 (218) 750-7390 (114) 776-2276 (7012) 219-3089

    Задача — найти неправильные номера. Для этого можно использовать следующую команду:

    grep -Ev '^\([0-9]{3}\) [0-9]{3}-[0-9]{4}#x27; phonenumbers.txt Output: (95) 213-1874 (37) 207-2639 (7012) 219-3089

    Здесь мы использовали параметр -v, чтобы обратить сопоставление и вывести только строки, не соответствующие указанному выражению. Поскольку круглые скобки считаются метасимволами в ERE, мы экранировали их обратными слешами, чтобы они интерпретировались как литералы.

    Поиск некорректных имен файлов

    Команда find поддерживает проверку, основанную на регулярном выражении. Тут важно помнить одну деталь: если grep выводит строку, содержащую совпадение с регулярным выражением, то find требует точного совпадения пути. Допустим нам нужно найти в директории имена файлов и каталогов, содержащие пробелы и другие, потенциально вредные символы:

    find . -regex '.*[^-_./0-9a-zA-Z].*'

    Последовательность .* в начале и конце означает любое количество любых символов. Такой прием необходим, так как find требует совпадения всего пути. В квадратных скобках находится отрицание множества допустимых символов в именах файлов. Таким образом любое имя файла или каталога, содержащее хотя бы один символ, не являющиеся дефисом, подчеркиванием, цифрой или латинской буквой, попадет в вывод.


    Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

    VPS для проекта

    VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

    StarterVDS

    490₽

    в месяц

    1 ядро

    1 ГБ RAM

    20 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Безлимитный трафик
    Заказать VPS
    Рекомендуем

    PerformanceVDS

    1190₽

    в месяц

    2 ядра

    4 ГБ RAM

    60 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Базовая DDoS-защита
    Заказать VPS

    Нужна другая конфигурация или чистый VPS без панели?

    Все тарифы VPS

    Похожие статьи, которые могут быть вам интересны

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

      Команда Simple-Server
      03.06.2026
      11 мин

      Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

      Что такое регулярные выражения?

      Регулярные выражения — это специальным образом записанные строки, используемые для поиска символьных шаблонов в тексте. Чем-то они похожи на групповые символы в оболочке, но их возможности куда шире. Многие утилиты для работы с текстом в Linux и языки программирования включают в себя механизм регулярных выражений. Здесь возникают проблемы: разные программы и языки оперируют различными диалектами регулярных выражений. В этой статье рассмотрим стандарт POSIX, которому соответствуют большинство утилит в Linux.

      Программа grep — это основной инструмент для работы с регулярными выражениями. Grep анализирует данные со стандартного ввода, ищет совпадения с указанным шаблоном и выводит все подходящие строки. Обычно grep предустановлен в большинстве дистрибутивов. Если хотите потренироваться в использовании регулярных выражений, можете повторять описанные команды в виртуальной машине, либо на арендованном сервере.

      Grep имеет следующий синтаксис:

      grep [параметры] регулярное_выражение [файл…]

      Самый простой случай использования grep — поиск строк, содержащих фиксированную подстроку. В следующем примере grep вывел все строки, содержащие последовательность nologin:

      grep nologin /etc/passwd Output: daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin games:x:5:60:games:/usr/games:/usr/sbin/nologin ...

      У grep имеются множество параметров. Подробно с ними ознакомиться можно в документации. Приведем ключи, полезные при работе с регулярными выражениями:

      Ключ -v — инвертировать критерий. В этом случае grep выводит строки, не содержащие совпадений:

      ls /bin | grep -v zip Output: [ 411toppm 7z 7za 7zr …

      Ключ -i — игнорировать регистр символов.

      Ключ -o — выводить не строки, а только совпадения с шаблоном:

      ls /bin | grep -o zip Output: zip zip zip zip …

      Ключ -w — искать только строки, содержащие все слово, которое составляет шаблон.

      ls /bin | grep -w zip Output: gpg-zip zip

      Для сравнения та же команда без опции. В вывод также попали строки, содержащие шаблон в качестве подслова в слове.

      ls /bin | grep zip Output bunzip2 bzip2 bzip2recover funzip ...

      Basic Regular Expressions

      Ранее упоминалось, что существует множество диалектов регулярных выражений. В стандарте POSIX рассматриваются два вида реализаций. Первый — Basic Regular Expressions (BRE). Ему соответствуют практически все POSIX-совместимые программы. Второй — Extended Regular Expression (ERE). Этот вид позволяет создавать более сложные регулярные выражения, но поддерживается не всеми утилитами. Для начала рассмотрим особенности BRE.

      В тексте выше мы уже столкнулись с простыми регулярными выражениями. К примеру, выражение «zip» обозначает строку, соответствующую следующим критериям: в строке не меньше трех символов; в строке присутствуют символы «z», «i», «p», причем именно в таком порядке; между ними нет других символов. Символы, соответствующие сами себе (как «z», «i», «p») называются литералами. Кроме того, существуют другая категория символов, называемая метасимволами. Они применяются для составления различных критериев поиска. К метасимволам в BRE относятся:

      Чтобы использовать метасимвол в качестве литерала, его нужно экранировать с помощью обратного слэша (\). Обратите внимание, что некоторые метасимволы имеют специальное значение в оболочке. Поэтому при передаче регулярного выражения в аргумент команды его следует заключать в кавычки.

      Метасимвол «точка» (.) соответствует любому символу в данной позиции. Например:

      ls /bin | grep '.zip' Output: bunzip2 bzip2 bzip2recover funzip gpg-zip gunzip gzip mzip p7zip pbzip2 preunzip prezip prezip-bin streamzip unzip unzipsfx

      Здесь имеется один важный момент. Программа zip не вошла в вывод, так как метасимвол «точка» увеличил длину обязательного совпадения до четырех символов.

      Символ «карет» (^) и «доллар» ($) в регулярных выражениях играют роль якорей. Это означает, что в их присутствии совпадение с шаблоном возможно, только если оно будет найдено в начале строки (^) или в ее конце ($).

      ls /bin | grep '^zip' Output: zip zipcloak zipdetails zipgrep … ls /bin | grep ‘zip$’ Output: funzip gpg-zip gunzip … ls /bin | grep ‘^zip$’ Output zip

      Регулярное выражение ^$ будет соответствовать пустым строкам.

      Кроме описания совпадения с любым символом в заданной позиции (.) в регулярных выражениях имеется возможность описать символ из определенного множества. Делается это с помощью квадратных скобок. В следующем примере ищутся соответствия со строками bzip и gzip:

      ls /bin | grep '[bg]zip' Output: bzip2 bzip2recover gzip

      Все метасимволы, кроме двух, теряют свое специальное значение внутри скобок.

      Если сразу после открывающей квадратной скобки стоит символ карет (^), остальные символы множества интерпретируются как недопустимые в данной позиции. Например:

      ls /bin | grep '[^bg]zip' Output: bunzip2 funzip gpg-zip gunzip mzip p7zip preunzip prezip prezip-bin streamzip unzip unzipsfx

      Включив отрицание, мы получили список имен файлов, содержащих последовательность zip, которой предшествуют любой символ, кроме b или g. Обратите внимание, что имя zip не было найдено. Символ отрицания не отменяет необходимости присутствия символа в заданной позиции. Кроме того символ карет является отрицанием, только если стоит сразу же после открывающей скобки; в противном случае он теряет свое специальное значение.

      С помощью дефиса (-) можно определять диапазоны символов. Так можно выразить любой диапазон символов и даже нескольких таких диапазонов. К примеру нам нужно найти все имена файлов, начинающиеся с буквы или цифры. Делается это так:

      ls ~ | grep '^[A-Za-z0-9]' Output: backup bin Books Desktop docker Documents Downloads GNS3 …

      При использовании диапазонов символов существует одна проблема. Диапазоны трактуются по-разному в зависимости от настроек локали. Например, в некоторых ситуациях диапазон [A-Z] интерпретируется в лексикографическом порядке, то есть он включает все алфавитные символы, кроме символа a в нижнем регистре. Для решения этой проблемы в стандарте POSIX придумали несколько классов, описывающих разные множества символов. Некоторые из них:

      • [:alnum:] — Алфавитно-цифровые символы; эквивалент диапазона [A-Za-z0-9] в ASCII.
      • [:alpha:] — Алфавитные символы; эквивалент диапазона [A-Za-z] в ASCII.
      • [:digit:] — Цифры от 0 до 9.
      • [:lower:] и [:upper:] — Символы нижнего и верхнего регистра соответственно.
      • [:space:] — Пробельные символы, включая пробел, табуляцию, возврат каретки, перевод строки, вертикальную табуляцию и перевод формата.

      Наличие классов символов не дает удобного способа выражения частичных диапазонов, таких как [A-M]. Пример использования:

      ls ~ | grep '[[:upper:]].*' Output: Books Desktop Documents Downloads GNS3 GOG Games Learning Music ...

      Extended Regular Expressions

      Особенности, рассматривавшиеся выше, поддерживаются практически всем POSIX-совместимыми приложениями и приложениями, реализующими BRE (например grep и потоковый редактор sed). Стандарт POSIX ERE позволяет создавать более выразительные регулярные выражения, однако не все программы умеют с ним работать. Диалект ERE поддерживался программой egrep, но GNU-версия grep также поддерживает расширенные регулярные выражения при вызове с ключом -E.

      В ERE множество метасимволов расширяются следующими:

      Чередование позволяет выбирать совпадение с одним из нескольких выражений. Так же как выражения в квадратных скобках позволяют одному символу соответствовать множеству указанных символов, чередование позволяет находить совпадение с множеством строки или других регулярных выражений. Чередование обозначается метасимволом вертикальной черты:

      echo "AAA" | grep -E 'AAA|BBB' Output: AAA echo "BBB" | grep -E 'AAA|BBB' Output: BBB echo "CCC" | grep -E 'AAA|BBB'

      Элементы регулярных выражений можно объединять и ссылаться на них как на один элемент. Делается это с помощью круглых скобок.

      Следующее выражение будет соответствовать именам файлов, начинающихся с bz, gz или zip. Если отбросить круглые скобки, смысл регулярного выражения изменится, и ему будут соответствовать имена, начинающиеся с bz или содержащие gz, или zip.

      ls /bin | grep -E '^(bz|gz|zip)' Output: bzcat bzgrep bzip2 bzip2recover bzless bzmore gzexe gzip zip zipdetails zipgrep zipinfo zipsplit

      Квантификаторы позволяют определить число совпадений с элементом. BRE поддерживают несколько способов.

      Квантификатор ? означает совпадение с элементом ноль или один раз. Иными словами совпадение с предыдущим элементом необязательно:

      echo "tet" | grep -E 'tes?t' Output: tet echo "test" | grep -E 'tes?t' Output: test echo "tesst" | grep -E 'tes?t' Output:

      В последнем случае совпадения не найдены, так как буква «s» встретилась дважды.

      Подобно метасимволу ?, звездочка (*) обозначает необязательный элемент; однако, в отличие от знака вопроса, этот элемент может встречаться любое число раз, а не только единожды. Рассмотрим предыдущий пример, используя вместо знака вопроса звездочку:

      echo "tet" | grep -E 'tes*t' Output: tet echo "test" | grep -E 'tes*t' Output: test echo "tesst" | grep -E 'tes*t' Output: tesst

      На этот раз все три строки совпали с шаблоном.

      Метасимвол + действует почти так же, как *, но требует совпадения с предыдущим элементом не менее одного раза:

      echo "tet" | grep -E 'tes+t' Output: echo "test" | grep -E 'tes+t' Output: test echo "tesst" | grep -E 'tes+t' Output: tesst

      Теперь с шаблоном не совпала первая строка, так как метасимвол + требует хотя бы одного совпадения с предыдущим элементом.

      В BRE существуют специальные метасимволы { и }, которые, в отличие от предыдущих квантификаторов, позволяют выразить минимальное и максимальное число обязательных совпадений. Всего существует четыре возможных способа задания числа совпадений:

      • {n} — Совпадение, если предыдущий элемент встречается точно n раз.
      • {n,m} — Совпадение, если предыдущий элемент встречается не менее n и не более m раз.
      • {n,} — Совпадение, если предыдущий элемент встречается n или более раз.
      • {,m} — Совпадение, если предыдущий элемент встречается не более m раз.
      echo "tet" | grep -E "tes{1,3}t" Output: echo "test" | grep -E "tes{1,3}t" Output: test echo "tesst" | grep -E "tes{1,3}t" Output: tesst echo "tessst" | grep -E "tes{1,3}t" Output: tessst echo "tesssst" | grep -E "tes{1,3}t" Output:

      С шаблоном совпали только те строки, где буква s встречается один, два или три раза.

      Регулярные выражения на практике

      В качестве заключения рассмотрим пару примеров, как регулярные выражения могут использоваться на практике.

      Проверка номеров телефонов

      Допустим, у нас имеется список номеров телефонов. Корректный формат номера: (nnn) nnn-nnnn. В списке 10 номеров, три номера имеют некорректный формат.

      cat phonenumbers.txt Output: (185) 136-1035 (95) 213-1874 (37) 207-2639 (285) 227-1602 (275) 298-1043 (107) 204-2197 (799) 240-1839 (218) 750-7390 (114) 776-2276 (7012) 219-3089

      Задача — найти неправильные номера. Для этого можно использовать следующую команду:

      grep -Ev '^\([0-9]{3}\) [0-9]{3}-[0-9]{4}#x27; phonenumbers.txt Output: (95) 213-1874 (37) 207-2639 (7012) 219-3089

      Здесь мы использовали параметр -v, чтобы обратить сопоставление и вывести только строки, не соответствующие указанному выражению. Поскольку круглые скобки считаются метасимволами в ERE, мы экранировали их обратными слешами, чтобы они интерпретировались как литералы.

      Поиск некорректных имен файлов

      Команда find поддерживает проверку, основанную на регулярном выражении. Тут важно помнить одну деталь: если grep выводит строку, содержащую совпадение с регулярным выражением, то find требует точного совпадения пути. Допустим нам нужно найти в директории имена файлов и каталогов, содержащие пробелы и другие, потенциально вредные символы:

      find . -regex '.*[^-_./0-9a-zA-Z].*'

      Последовательность .* в начале и конце означает любое количество любых символов. Такой прием необходим, так как find требует совпадения всего пути. В квадратных скобках находится отрицание множества допустимых символов в именах файлов. Таким образом любое имя файла или каталога, содержащее хотя бы один символ, не являющиеся дефисом, подчеркиванием, цифрой или латинской буквой, попадет в вывод.


      Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

      VPS для проекта

      VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

      StarterVDS

      490₽

      в месяц

      1 ядро

      1 ГБ RAM

      20 ГБ NVMe

      • 1 IPv4
      • KVM
      • Root-доступ
      • Безлимитный трафик
      Заказать VPS
      Рекомендуем

      PerformanceVDS

      1190₽

      в месяц

      2 ядра

      4 ГБ RAM

      60 ГБ NVMe

      • 1 IPv4
      • KVM
      • Root-доступ
      • Базовая DDoS-защита
      Заказать VPS

      Нужна другая конфигурация или чистый VPS без панели?

      Все тарифы VPS

      Похожие статьи, которые могут быть вам интересны

      ) в регулярных выражениях играют роль якорей. Это означает, что в их присутствии совпадение с шаблоном возможно, только если оно будет найдено в начале строки (`^`) или в ее конце (` Регулярные выражения Bash: полный гайд | Simple-Server

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

        Команда Simple-Server
        03.06.2026
        11 мин

        Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

        Что такое регулярные выражения?

        Регулярные выражения — это специальным образом записанные строки, используемые для поиска символьных шаблонов в тексте. Чем-то они похожи на групповые символы в оболочке, но их возможности куда шире. Многие утилиты для работы с текстом в Linux и языки программирования включают в себя механизм регулярных выражений. Здесь возникают проблемы: разные программы и языки оперируют различными диалектами регулярных выражений. В этой статье рассмотрим стандарт POSIX, которому соответствуют большинство утилит в Linux.

        Программа grep — это основной инструмент для работы с регулярными выражениями. Grep анализирует данные со стандартного ввода, ищет совпадения с указанным шаблоном и выводит все подходящие строки. Обычно grep предустановлен в большинстве дистрибутивов. Если хотите потренироваться в использовании регулярных выражений, можете повторять описанные команды в виртуальной машине, либо на арендованном сервере.

        Grep имеет следующий синтаксис:

        grep [параметры] регулярное_выражение [файл…]

        Самый простой случай использования grep — поиск строк, содержащих фиксированную подстроку. В следующем примере grep вывел все строки, содержащие последовательность nologin:

        grep nologin /etc/passwd Output: daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin games:x:5:60:games:/usr/games:/usr/sbin/nologin ...

        У grep имеются множество параметров. Подробно с ними ознакомиться можно в документации. Приведем ключи, полезные при работе с регулярными выражениями:

        Ключ -v — инвертировать критерий. В этом случае grep выводит строки, не содержащие совпадений:

        ls /bin | grep -v zip Output: [ 411toppm 7z 7za 7zr …

        Ключ -i — игнорировать регистр символов.

        Ключ -o — выводить не строки, а только совпадения с шаблоном:

        ls /bin | grep -o zip Output: zip zip zip zip …

        Ключ -w — искать только строки, содержащие все слово, которое составляет шаблон.

        ls /bin | grep -w zip Output: gpg-zip zip

        Для сравнения та же команда без опции. В вывод также попали строки, содержащие шаблон в качестве подслова в слове.

        ls /bin | grep zip Output bunzip2 bzip2 bzip2recover funzip ...

        Basic Regular Expressions

        Ранее упоминалось, что существует множество диалектов регулярных выражений. В стандарте POSIX рассматриваются два вида реализаций. Первый — Basic Regular Expressions (BRE). Ему соответствуют практически все POSIX-совместимые программы. Второй — Extended Regular Expression (ERE). Этот вид позволяет создавать более сложные регулярные выражения, но поддерживается не всеми утилитами. Для начала рассмотрим особенности BRE.

        В тексте выше мы уже столкнулись с простыми регулярными выражениями. К примеру, выражение «zip» обозначает строку, соответствующую следующим критериям: в строке не меньше трех символов; в строке присутствуют символы «z», «i», «p», причем именно в таком порядке; между ними нет других символов. Символы, соответствующие сами себе (как «z», «i», «p») называются литералами. Кроме того, существуют другая категория символов, называемая метасимволами. Они применяются для составления различных критериев поиска. К метасимволам в BRE относятся:

        Чтобы использовать метасимвол в качестве литерала, его нужно экранировать с помощью обратного слэша (\). Обратите внимание, что некоторые метасимволы имеют специальное значение в оболочке. Поэтому при передаче регулярного выражения в аргумент команды его следует заключать в кавычки.

        Метасимвол «точка» (.) соответствует любому символу в данной позиции. Например:

        ls /bin | grep '.zip' Output: bunzip2 bzip2 bzip2recover funzip gpg-zip gunzip gzip mzip p7zip pbzip2 preunzip prezip prezip-bin streamzip unzip unzipsfx

        Здесь имеется один важный момент. Программа zip не вошла в вывод, так как метасимвол «точка» увеличил длину обязательного совпадения до четырех символов.

        Символ «карет» (^) и «доллар» ($) в регулярных выражениях играют роль якорей. Это означает, что в их присутствии совпадение с шаблоном возможно, только если оно будет найдено в начале строки (^) или в ее конце ($).

        ls /bin | grep '^zip' Output: zip zipcloak zipdetails zipgrep … ls /bin | grep ‘zip$’ Output: funzip gpg-zip gunzip … ls /bin | grep ‘^zip$’ Output zip

        Регулярное выражение ^$ будет соответствовать пустым строкам.

        Кроме описания совпадения с любым символом в заданной позиции (.) в регулярных выражениях имеется возможность описать символ из определенного множества. Делается это с помощью квадратных скобок. В следующем примере ищутся соответствия со строками bzip и gzip:

        ls /bin | grep '[bg]zip' Output: bzip2 bzip2recover gzip

        Все метасимволы, кроме двух, теряют свое специальное значение внутри скобок.

        Если сразу после открывающей квадратной скобки стоит символ карет (^), остальные символы множества интерпретируются как недопустимые в данной позиции. Например:

        ls /bin | grep '[^bg]zip' Output: bunzip2 funzip gpg-zip gunzip mzip p7zip preunzip prezip prezip-bin streamzip unzip unzipsfx

        Включив отрицание, мы получили список имен файлов, содержащих последовательность zip, которой предшествуют любой символ, кроме b или g. Обратите внимание, что имя zip не было найдено. Символ отрицания не отменяет необходимости присутствия символа в заданной позиции. Кроме того символ карет является отрицанием, только если стоит сразу же после открывающей скобки; в противном случае он теряет свое специальное значение.

        С помощью дефиса (-) можно определять диапазоны символов. Так можно выразить любой диапазон символов и даже нескольких таких диапазонов. К примеру нам нужно найти все имена файлов, начинающиеся с буквы или цифры. Делается это так:

        ls ~ | grep '^[A-Za-z0-9]' Output: backup bin Books Desktop docker Documents Downloads GNS3 …

        При использовании диапазонов символов существует одна проблема. Диапазоны трактуются по-разному в зависимости от настроек локали. Например, в некоторых ситуациях диапазон [A-Z] интерпретируется в лексикографическом порядке, то есть он включает все алфавитные символы, кроме символа a в нижнем регистре. Для решения этой проблемы в стандарте POSIX придумали несколько классов, описывающих разные множества символов. Некоторые из них:

        • [:alnum:] — Алфавитно-цифровые символы; эквивалент диапазона [A-Za-z0-9] в ASCII.
        • [:alpha:] — Алфавитные символы; эквивалент диапазона [A-Za-z] в ASCII.
        • [:digit:] — Цифры от 0 до 9.
        • [:lower:] и [:upper:] — Символы нижнего и верхнего регистра соответственно.
        • [:space:] — Пробельные символы, включая пробел, табуляцию, возврат каретки, перевод строки, вертикальную табуляцию и перевод формата.

        Наличие классов символов не дает удобного способа выражения частичных диапазонов, таких как [A-M]. Пример использования:

        ls ~ | grep '[[:upper:]].*' Output: Books Desktop Documents Downloads GNS3 GOG Games Learning Music ...

        Extended Regular Expressions

        Особенности, рассматривавшиеся выше, поддерживаются практически всем POSIX-совместимыми приложениями и приложениями, реализующими BRE (например grep и потоковый редактор sed). Стандарт POSIX ERE позволяет создавать более выразительные регулярные выражения, однако не все программы умеют с ним работать. Диалект ERE поддерживался программой egrep, но GNU-версия grep также поддерживает расширенные регулярные выражения при вызове с ключом -E.

        В ERE множество метасимволов расширяются следующими:

        Чередование позволяет выбирать совпадение с одним из нескольких выражений. Так же как выражения в квадратных скобках позволяют одному символу соответствовать множеству указанных символов, чередование позволяет находить совпадение с множеством строки или других регулярных выражений. Чередование обозначается метасимволом вертикальной черты:

        echo "AAA" | grep -E 'AAA|BBB' Output: AAA echo "BBB" | grep -E 'AAA|BBB' Output: BBB echo "CCC" | grep -E 'AAA|BBB'

        Элементы регулярных выражений можно объединять и ссылаться на них как на один элемент. Делается это с помощью круглых скобок.

        Следующее выражение будет соответствовать именам файлов, начинающихся с bz, gz или zip. Если отбросить круглые скобки, смысл регулярного выражения изменится, и ему будут соответствовать имена, начинающиеся с bz или содержащие gz, или zip.

        ls /bin | grep -E '^(bz|gz|zip)' Output: bzcat bzgrep bzip2 bzip2recover bzless bzmore gzexe gzip zip zipdetails zipgrep zipinfo zipsplit

        Квантификаторы позволяют определить число совпадений с элементом. BRE поддерживают несколько способов.

        Квантификатор ? означает совпадение с элементом ноль или один раз. Иными словами совпадение с предыдущим элементом необязательно:

        echo "tet" | grep -E 'tes?t' Output: tet echo "test" | grep -E 'tes?t' Output: test echo "tesst" | grep -E 'tes?t' Output:

        В последнем случае совпадения не найдены, так как буква «s» встретилась дважды.

        Подобно метасимволу ?, звездочка (*) обозначает необязательный элемент; однако, в отличие от знака вопроса, этот элемент может встречаться любое число раз, а не только единожды. Рассмотрим предыдущий пример, используя вместо знака вопроса звездочку:

        echo "tet" | grep -E 'tes*t' Output: tet echo "test" | grep -E 'tes*t' Output: test echo "tesst" | grep -E 'tes*t' Output: tesst

        На этот раз все три строки совпали с шаблоном.

        Метасимвол + действует почти так же, как *, но требует совпадения с предыдущим элементом не менее одного раза:

        echo "tet" | grep -E 'tes+t' Output: echo "test" | grep -E 'tes+t' Output: test echo "tesst" | grep -E 'tes+t' Output: tesst

        Теперь с шаблоном не совпала первая строка, так как метасимвол + требует хотя бы одного совпадения с предыдущим элементом.

        В BRE существуют специальные метасимволы { и }, которые, в отличие от предыдущих квантификаторов, позволяют выразить минимальное и максимальное число обязательных совпадений. Всего существует четыре возможных способа задания числа совпадений:

        • {n} — Совпадение, если предыдущий элемент встречается точно n раз.
        • {n,m} — Совпадение, если предыдущий элемент встречается не менее n и не более m раз.
        • {n,} — Совпадение, если предыдущий элемент встречается n или более раз.
        • {,m} — Совпадение, если предыдущий элемент встречается не более m раз.
        echo "tet" | grep -E "tes{1,3}t" Output: echo "test" | grep -E "tes{1,3}t" Output: test echo "tesst" | grep -E "tes{1,3}t" Output: tesst echo "tessst" | grep -E "tes{1,3}t" Output: tessst echo "tesssst" | grep -E "tes{1,3}t" Output:

        С шаблоном совпали только те строки, где буква s встречается один, два или три раза.

        Регулярные выражения на практике

        В качестве заключения рассмотрим пару примеров, как регулярные выражения могут использоваться на практике.

        Проверка номеров телефонов

        Допустим, у нас имеется список номеров телефонов. Корректный формат номера: (nnn) nnn-nnnn. В списке 10 номеров, три номера имеют некорректный формат.

        cat phonenumbers.txt Output: (185) 136-1035 (95) 213-1874 (37) 207-2639 (285) 227-1602 (275) 298-1043 (107) 204-2197 (799) 240-1839 (218) 750-7390 (114) 776-2276 (7012) 219-3089

        Задача — найти неправильные номера. Для этого можно использовать следующую команду:

        grep -Ev '^\([0-9]{3}\) [0-9]{3}-[0-9]{4}#x27; phonenumbers.txt Output: (95) 213-1874 (37) 207-2639 (7012) 219-3089

        Здесь мы использовали параметр -v, чтобы обратить сопоставление и вывести только строки, не соответствующие указанному выражению. Поскольку круглые скобки считаются метасимволами в ERE, мы экранировали их обратными слешами, чтобы они интерпретировались как литералы.

        Поиск некорректных имен файлов

        Команда find поддерживает проверку, основанную на регулярном выражении. Тут важно помнить одну деталь: если grep выводит строку, содержащую совпадение с регулярным выражением, то find требует точного совпадения пути. Допустим нам нужно найти в директории имена файлов и каталогов, содержащие пробелы и другие, потенциально вредные символы:

        find . -regex '.*[^-_./0-9a-zA-Z].*'

        Последовательность .* в начале и конце означает любое количество любых символов. Такой прием необходим, так как find требует совпадения всего пути. В квадратных скобках находится отрицание множества допустимых символов в именах файлов. Таким образом любое имя файла или каталога, содержащее хотя бы один символ, не являющиеся дефисом, подчеркиванием, цифрой или латинской буквой, попадет в вывод.


        Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

        VPS для проекта

        VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

        StarterVDS

        490₽

        в месяц

        1 ядро

        1 ГБ RAM

        20 ГБ NVMe

        • 1 IPv4
        • KVM
        • Root-доступ
        • Безлимитный трафик
        Заказать VPS
        Рекомендуем

        PerformanceVDS

        1190₽

        в месяц

        2 ядра

        4 ГБ RAM

        60 ГБ NVMe

        • 1 IPv4
        • KVM
        • Root-доступ
        • Базовая DDoS-защита
        Заказать VPS

        Нужна другая конфигурация или чистый VPS без панели?

        Все тарифы VPS

        Похожие статьи, которые могут быть вам интересны

        ).\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nls /bin | grep '^zip'\r\nOutput:\r\nzip\r\nzipcloak\r\nzipdetails\r\nzipgrep\r\n…\r\nls /bin | grep ‘zip$’\r\nOutput:\r\nfunzip\r\ngpg-zip\r\ngunzip\r\n…\r\nls /bin | grep ‘^zip$’\r\nOutput\r\nzip\n```\n\n \r\n\r\nРегулярное выражение `^ Регулярные выражения Bash: полный гайд | Simple-Server

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

          Команда Simple-Server
          03.06.2026
          11 мин

          Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

          Что такое регулярные выражения?

          Регулярные выражения — это специальным образом записанные строки, используемые для поиска символьных шаблонов в тексте. Чем-то они похожи на групповые символы в оболочке, но их возможности куда шире. Многие утилиты для работы с текстом в Linux и языки программирования включают в себя механизм регулярных выражений. Здесь возникают проблемы: разные программы и языки оперируют различными диалектами регулярных выражений. В этой статье рассмотрим стандарт POSIX, которому соответствуют большинство утилит в Linux.

          Программа grep — это основной инструмент для работы с регулярными выражениями. Grep анализирует данные со стандартного ввода, ищет совпадения с указанным шаблоном и выводит все подходящие строки. Обычно grep предустановлен в большинстве дистрибутивов. Если хотите потренироваться в использовании регулярных выражений, можете повторять описанные команды в виртуальной машине, либо на арендованном сервере.

          Grep имеет следующий синтаксис:

          grep [параметры] регулярное_выражение [файл…]

          Самый простой случай использования grep — поиск строк, содержащих фиксированную подстроку. В следующем примере grep вывел все строки, содержащие последовательность nologin:

          grep nologin /etc/passwd Output: daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin games:x:5:60:games:/usr/games:/usr/sbin/nologin ...

          У grep имеются множество параметров. Подробно с ними ознакомиться можно в документации. Приведем ключи, полезные при работе с регулярными выражениями:

          Ключ -v — инвертировать критерий. В этом случае grep выводит строки, не содержащие совпадений:

          ls /bin | grep -v zip Output: [ 411toppm 7z 7za 7zr …

          Ключ -i — игнорировать регистр символов.

          Ключ -o — выводить не строки, а только совпадения с шаблоном:

          ls /bin | grep -o zip Output: zip zip zip zip …

          Ключ -w — искать только строки, содержащие все слово, которое составляет шаблон.

          ls /bin | grep -w zip Output: gpg-zip zip

          Для сравнения та же команда без опции. В вывод также попали строки, содержащие шаблон в качестве подслова в слове.

          ls /bin | grep zip Output bunzip2 bzip2 bzip2recover funzip ...

          Basic Regular Expressions

          Ранее упоминалось, что существует множество диалектов регулярных выражений. В стандарте POSIX рассматриваются два вида реализаций. Первый — Basic Regular Expressions (BRE). Ему соответствуют практически все POSIX-совместимые программы. Второй — Extended Regular Expression (ERE). Этот вид позволяет создавать более сложные регулярные выражения, но поддерживается не всеми утилитами. Для начала рассмотрим особенности BRE.

          В тексте выше мы уже столкнулись с простыми регулярными выражениями. К примеру, выражение «zip» обозначает строку, соответствующую следующим критериям: в строке не меньше трех символов; в строке присутствуют символы «z», «i», «p», причем именно в таком порядке; между ними нет других символов. Символы, соответствующие сами себе (как «z», «i», «p») называются литералами. Кроме того, существуют другая категория символов, называемая метасимволами. Они применяются для составления различных критериев поиска. К метасимволам в BRE относятся:

          Чтобы использовать метасимвол в качестве литерала, его нужно экранировать с помощью обратного слэша (\). Обратите внимание, что некоторые метасимволы имеют специальное значение в оболочке. Поэтому при передаче регулярного выражения в аргумент команды его следует заключать в кавычки.

          Метасимвол «точка» (.) соответствует любому символу в данной позиции. Например:

          ls /bin | grep '.zip' Output: bunzip2 bzip2 bzip2recover funzip gpg-zip gunzip gzip mzip p7zip pbzip2 preunzip prezip prezip-bin streamzip unzip unzipsfx

          Здесь имеется один важный момент. Программа zip не вошла в вывод, так как метасимвол «точка» увеличил длину обязательного совпадения до четырех символов.

          Символ «карет» (^) и «доллар» ($) в регулярных выражениях играют роль якорей. Это означает, что в их присутствии совпадение с шаблоном возможно, только если оно будет найдено в начале строки (^) или в ее конце ($).

          ls /bin | grep '^zip' Output: zip zipcloak zipdetails zipgrep … ls /bin | grep ‘zip$’ Output: funzip gpg-zip gunzip … ls /bin | grep ‘^zip$’ Output zip

          Регулярное выражение ^$ будет соответствовать пустым строкам.

          Кроме описания совпадения с любым символом в заданной позиции (.) в регулярных выражениях имеется возможность описать символ из определенного множества. Делается это с помощью квадратных скобок. В следующем примере ищутся соответствия со строками bzip и gzip:

          ls /bin | grep '[bg]zip' Output: bzip2 bzip2recover gzip

          Все метасимволы, кроме двух, теряют свое специальное значение внутри скобок.

          Если сразу после открывающей квадратной скобки стоит символ карет (^), остальные символы множества интерпретируются как недопустимые в данной позиции. Например:

          ls /bin | grep '[^bg]zip' Output: bunzip2 funzip gpg-zip gunzip mzip p7zip preunzip prezip prezip-bin streamzip unzip unzipsfx

          Включив отрицание, мы получили список имен файлов, содержащих последовательность zip, которой предшествуют любой символ, кроме b или g. Обратите внимание, что имя zip не было найдено. Символ отрицания не отменяет необходимости присутствия символа в заданной позиции. Кроме того символ карет является отрицанием, только если стоит сразу же после открывающей скобки; в противном случае он теряет свое специальное значение.

          С помощью дефиса (-) можно определять диапазоны символов. Так можно выразить любой диапазон символов и даже нескольких таких диапазонов. К примеру нам нужно найти все имена файлов, начинающиеся с буквы или цифры. Делается это так:

          ls ~ | grep '^[A-Za-z0-9]' Output: backup bin Books Desktop docker Documents Downloads GNS3 …

          При использовании диапазонов символов существует одна проблема. Диапазоны трактуются по-разному в зависимости от настроек локали. Например, в некоторых ситуациях диапазон [A-Z] интерпретируется в лексикографическом порядке, то есть он включает все алфавитные символы, кроме символа a в нижнем регистре. Для решения этой проблемы в стандарте POSIX придумали несколько классов, описывающих разные множества символов. Некоторые из них:

          • [:alnum:] — Алфавитно-цифровые символы; эквивалент диапазона [A-Za-z0-9] в ASCII.
          • [:alpha:] — Алфавитные символы; эквивалент диапазона [A-Za-z] в ASCII.
          • [:digit:] — Цифры от 0 до 9.
          • [:lower:] и [:upper:] — Символы нижнего и верхнего регистра соответственно.
          • [:space:] — Пробельные символы, включая пробел, табуляцию, возврат каретки, перевод строки, вертикальную табуляцию и перевод формата.

          Наличие классов символов не дает удобного способа выражения частичных диапазонов, таких как [A-M]. Пример использования:

          ls ~ | grep '[[:upper:]].*' Output: Books Desktop Documents Downloads GNS3 GOG Games Learning Music ...

          Extended Regular Expressions

          Особенности, рассматривавшиеся выше, поддерживаются практически всем POSIX-совместимыми приложениями и приложениями, реализующими BRE (например grep и потоковый редактор sed). Стандарт POSIX ERE позволяет создавать более выразительные регулярные выражения, однако не все программы умеют с ним работать. Диалект ERE поддерживался программой egrep, но GNU-версия grep также поддерживает расширенные регулярные выражения при вызове с ключом -E.

          В ERE множество метасимволов расширяются следующими:

          Чередование позволяет выбирать совпадение с одним из нескольких выражений. Так же как выражения в квадратных скобках позволяют одному символу соответствовать множеству указанных символов, чередование позволяет находить совпадение с множеством строки или других регулярных выражений. Чередование обозначается метасимволом вертикальной черты:

          echo "AAA" | grep -E 'AAA|BBB' Output: AAA echo "BBB" | grep -E 'AAA|BBB' Output: BBB echo "CCC" | grep -E 'AAA|BBB'

          Элементы регулярных выражений можно объединять и ссылаться на них как на один элемент. Делается это с помощью круглых скобок.

          Следующее выражение будет соответствовать именам файлов, начинающихся с bz, gz или zip. Если отбросить круглые скобки, смысл регулярного выражения изменится, и ему будут соответствовать имена, начинающиеся с bz или содержащие gz, или zip.

          ls /bin | grep -E '^(bz|gz|zip)' Output: bzcat bzgrep bzip2 bzip2recover bzless bzmore gzexe gzip zip zipdetails zipgrep zipinfo zipsplit

          Квантификаторы позволяют определить число совпадений с элементом. BRE поддерживают несколько способов.

          Квантификатор ? означает совпадение с элементом ноль или один раз. Иными словами совпадение с предыдущим элементом необязательно:

          echo "tet" | grep -E 'tes?t' Output: tet echo "test" | grep -E 'tes?t' Output: test echo "tesst" | grep -E 'tes?t' Output:

          В последнем случае совпадения не найдены, так как буква «s» встретилась дважды.

          Подобно метасимволу ?, звездочка (*) обозначает необязательный элемент; однако, в отличие от знака вопроса, этот элемент может встречаться любое число раз, а не только единожды. Рассмотрим предыдущий пример, используя вместо знака вопроса звездочку:

          echo "tet" | grep -E 'tes*t' Output: tet echo "test" | grep -E 'tes*t' Output: test echo "tesst" | grep -E 'tes*t' Output: tesst

          На этот раз все три строки совпали с шаблоном.

          Метасимвол + действует почти так же, как *, но требует совпадения с предыдущим элементом не менее одного раза:

          echo "tet" | grep -E 'tes+t' Output: echo "test" | grep -E 'tes+t' Output: test echo "tesst" | grep -E 'tes+t' Output: tesst

          Теперь с шаблоном не совпала первая строка, так как метасимвол + требует хотя бы одного совпадения с предыдущим элементом.

          В BRE существуют специальные метасимволы { и }, которые, в отличие от предыдущих квантификаторов, позволяют выразить минимальное и максимальное число обязательных совпадений. Всего существует четыре возможных способа задания числа совпадений:

          • {n} — Совпадение, если предыдущий элемент встречается точно n раз.
          • {n,m} — Совпадение, если предыдущий элемент встречается не менее n и не более m раз.
          • {n,} — Совпадение, если предыдущий элемент встречается n или более раз.
          • {,m} — Совпадение, если предыдущий элемент встречается не более m раз.
          echo "tet" | grep -E "tes{1,3}t" Output: echo "test" | grep -E "tes{1,3}t" Output: test echo "tesst" | grep -E "tes{1,3}t" Output: tesst echo "tessst" | grep -E "tes{1,3}t" Output: tessst echo "tesssst" | grep -E "tes{1,3}t" Output:

          С шаблоном совпали только те строки, где буква s встречается один, два или три раза.

          Регулярные выражения на практике

          В качестве заключения рассмотрим пару примеров, как регулярные выражения могут использоваться на практике.

          Проверка номеров телефонов

          Допустим, у нас имеется список номеров телефонов. Корректный формат номера: (nnn) nnn-nnnn. В списке 10 номеров, три номера имеют некорректный формат.

          cat phonenumbers.txt Output: (185) 136-1035 (95) 213-1874 (37) 207-2639 (285) 227-1602 (275) 298-1043 (107) 204-2197 (799) 240-1839 (218) 750-7390 (114) 776-2276 (7012) 219-3089

          Задача — найти неправильные номера. Для этого можно использовать следующую команду:

          grep -Ev '^\([0-9]{3}\) [0-9]{3}-[0-9]{4}#x27; phonenumbers.txt Output: (95) 213-1874 (37) 207-2639 (7012) 219-3089

          Здесь мы использовали параметр -v, чтобы обратить сопоставление и вывести только строки, не соответствующие указанному выражению. Поскольку круглые скобки считаются метасимволами в ERE, мы экранировали их обратными слешами, чтобы они интерпретировались как литералы.

          Поиск некорректных имен файлов

          Команда find поддерживает проверку, основанную на регулярном выражении. Тут важно помнить одну деталь: если grep выводит строку, содержащую совпадение с регулярным выражением, то find требует точного совпадения пути. Допустим нам нужно найти в директории имена файлов и каталогов, содержащие пробелы и другие, потенциально вредные символы:

          find . -regex '.*[^-_./0-9a-zA-Z].*'

          Последовательность .* в начале и конце означает любое количество любых символов. Такой прием необходим, так как find требует совпадения всего пути. В квадратных скобках находится отрицание множества допустимых символов в именах файлов. Таким образом любое имя файла или каталога, содержащее хотя бы один символ, не являющиеся дефисом, подчеркиванием, цифрой или латинской буквой, попадет в вывод.


          Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

          VPS для проекта

          VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

          StarterVDS

          490₽

          в месяц

          1 ядро

          1 ГБ RAM

          20 ГБ NVMe

          • 1 IPv4
          • KVM
          • Root-доступ
          • Безлимитный трафик
          Заказать VPS
          Рекомендуем

          PerformanceVDS

          1190₽

          в месяц

          2 ядра

          4 ГБ RAM

          60 ГБ NVMe

          • 1 IPv4
          • KVM
          • Root-доступ
          • Базовая DDoS-защита
          Заказать VPS

          Нужна другая конфигурация или чистый VPS без панели?

          Все тарифы VPS

          Похожие статьи, которые могут быть вам интересны

          будет соответствовать пустым строкам.\r\n\r\nКроме описания совпадения с любым символом в заданной позиции (`.`) в регулярных выражениях имеется возможность описать символ из определенного множества. Делается это с помощью квадратных скобок. В следующем примере ищутся соответствия со строками bzip и gzip:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nls /bin | grep '[bg]zip'\r\nOutput:\r\nbzip2\r\nbzip2recover\r\ngzip\n```\n\n \r\n\r\nВсе метасимволы, кроме двух, теряют свое специальное значение внутри скобок.\r\n\r\nЕсли сразу после открывающей квадратной скобки стоит символ карет (`^`), остальные символы множества интерпретируются как недопустимые в данной позиции. Например:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nls /bin | grep '[^bg]zip'\r\nOutput:\r\nbunzip2\r\nfunzip\r\ngpg-zip\r\ngunzip\r\nmzip\r\np7zip\r\npreunzip\r\nprezip\r\nprezip-bin\r\nstreamzip\r\nunzip\r\nunzipsfx\n```\n\n \r\n\r\nВключив отрицание, мы получили список имен файлов, содержащих последовательность zip, которой предшествуют любой символ, кроме b или g. Обратите внимание, что имя zip не было найдено. Символ отрицания не отменяет необходимости присутствия символа в заданной позиции. Кроме того символ карет является отрицанием, только если стоит сразу же после открывающей скобки; в противном случае он теряет свое специальное значение.\r\n\r\nС помощью дефиса (`-`) можно определять диапазоны символов. Так можно выразить любой диапазон символов и даже нескольких таких диапазонов. К примеру нам нужно найти все имена файлов, начинающиеся с буквы или цифры. Делается это так:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nls ~ | grep '^[A-Za-z0-9]'\r\nOutput:\r\nbackup\r\nbin\r\nBooks\r\nDesktop\r\ndocker\r\nDocuments\r\nDownloads\r\nGNS3\r\n…\n```\n\n \r\n\r\nПри использовании диапазонов символов существует одна проблема. Диапазоны трактуются по-разному в зависимости от настроек локали. Например, в некоторых ситуациях диапазон [A-Z] интерпретируется в лексикографическом порядке, то есть он включает все алфавитные символы, кроме символа a в нижнем регистре. Для решения этой проблемы в стандарте POSIX придумали несколько классов, описывающих разные множества символов. Некоторые из них:\r\n\r\n * `[:alnum:]` — Алфавитно-цифровые символы; эквивалент диапазона [A-Za-z0-9] в ASCII.\r\n * `[:alpha:]` — Алфавитные символы; эквивалент диапазона [A-Za-z] в ASCII.\r\n * `[:digit:]` — Цифры от 0 до 9.\r\n * `[:lower:]` и `[:upper:]` — Символы нижнего и верхнего регистра соответственно.\r\n * `[:space:]` — Пробельные символы, включая пробел, табуляцию, возврат каретки, перевод строки, вертикальную табуляцию и перевод формата.\r\n\r\n\r\nНаличие классов символов не дает удобного способа выражения частичных диапазонов, таких как [A-M]. Пример использования:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nls ~ | grep '[[:upper:]].*'\r\nOutput:\r\nBooks\r\nDesktop\r\nDocuments\r\nDownloads\r\nGNS3\r\nGOG Games\r\nLearning\r\nMusic\r\n...\n```\n\n \r\n\r\n## Extended Regular Expressions \r\n\r\nОсобенности, рассматривавшиеся выше, поддерживаются практически всем POSIX-совместимыми приложениями и приложениями, реализующими BRE (например grep и потоковый редактор sed). Стандарт POSIX ERE позволяет создавать более выразительные регулярные выражения, однако не все программы умеют с ним работать. Диалект ERE поддерживался программой egrep, но GNU-версия grep также поддерживает расширенные регулярные выражения при вызове с ключом `-E`. \r\n\r\nВ ERE множество метасимволов расширяются следующими:\r\n\r\nЧередование позволяет выбирать совпадение с одним из нескольких выражений. Так же как выражения в квадратных скобках позволяют одному символу соответствовать множеству указанных символов, чередование позволяет находить совпадение с множеством строки или других регулярных выражений. Чередование обозначается метасимволом вертикальной черты:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\necho \"AAA\" | grep -E 'AAA|BBB'\r\nOutput:\r\nAAA\r\necho \"BBB\" | grep -E 'AAA|BBB'\r\nOutput:\r\nBBB\r\necho \"CCC\" | grep -E 'AAA|BBB'\n```\n\n \r\n\r\nЭлементы регулярных выражений можно объединять и ссылаться на них как на один элемент. Делается это с помощью круглых скобок.\r\n\r\nСледующее выражение будет соответствовать именам файлов, начинающихся с bz, gz или zip. Если отбросить круглые скобки, смысл регулярного выражения изменится, и ему будут соответствовать имена, начинающиеся с bz или содержащие gz, или zip.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nls /bin | grep -E '^(bz|gz|zip)'\r\nOutput:\r\nbzcat\r\nbzgrep\r\nbzip2\r\nbzip2recover\r\nbzless\r\nbzmore\r\ngzexe\r\ngzip\r\nzip\r\nzipdetails\r\nzipgrep\r\nzipinfo\r\nzipsplit\n```\n\n \r\n\r\nКвантификаторы позволяют определить число совпадений с элементом. BRE поддерживают несколько способов.\r\n\r\nКвантификатор `?` означает совпадение с элементом ноль или один раз. Иными словами совпадение с предыдущим элементом необязательно:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\necho \"tet\" | grep -E 'tes?t'\r\nOutput:\r\ntet\r\necho \"test\" | grep -E 'tes?t'\r\nOutput:\r\ntest\r\necho \"tesst\" | grep -E 'tes?t'\r\nOutput:\n```\n\n \r\n\r\nВ последнем случае совпадения не найдены, так как буква «s» встретилась дважды.\r\n\r\nПодобно метасимволу `?`, звездочка (`*`) обозначает необязательный элемент; однако, в отличие от знака вопроса, этот элемент может встречаться любое число раз, а не только единожды. Рассмотрим предыдущий пример, используя вместо знака вопроса звездочку:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\necho \"tet\" | grep -E 'tes*t'\r\nOutput:\r\ntet\r\necho \"test\" | grep -E 'tes*t'\r\nOutput:\r\ntest\r\necho \"tesst\" | grep -E 'tes*t'\r\nOutput:\r\ntesst\n```\n\n \r\n\r\nНа этот раз все три строки совпали с шаблоном.\r\n\r\nМетасимвол `+` действует почти так же, как `*`, но требует совпадения с предыдущим элементом не менее одного раза:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\necho \"tet\" | grep -E 'tes+t'\r\nOutput:\r\necho \"test\" | grep -E 'tes+t'\r\nOutput:\r\ntest\r\necho \"tesst\" | grep -E 'tes+t'\r\nOutput:\r\ntesst\n```\n\n \r\n\r\nТеперь с шаблоном не совпала первая строка, так как метасимвол `+` требует хотя бы одного совпадения с предыдущим элементом.\r\n\r\nВ BRE существуют специальные метасимволы `{` и `}`, которые, в отличие от предыдущих квантификаторов, позволяют выразить минимальное и максимальное число обязательных совпадений. Всего существует четыре возможных способа задания числа совпадений:\r\n\r\n * `{n}` — Совпадение, если предыдущий элемент встречается точно n раз.\r\n * `{n,m}` — Совпадение, если предыдущий элемент встречается не менее n и не более m раз.\r\n * `{n,}` — Совпадение, если предыдущий элемент встречается n или более раз.\r\n * `{,m}` — Совпадение, если предыдущий элемент встречается не более m раз.\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\necho \"tet\" | grep -E \"tes{1,3}t\"\r\nOutput:\r\necho \"test\" | grep -E \"tes{1,3}t\"\r\nOutput:\r\ntest\r\necho \"tesst\" | grep -E \"tes{1,3}t\"\r\nOutput:\r\ntesst\r\necho \"tessst\" | grep -E \"tes{1,3}t\"\r\nOutput:\r\ntessst\r\necho \"tesssst\" | grep -E \"tes{1,3}t\"\r\nOutput:\n```\n\n \r\n\r\nС шаблоном совпали только те строки, где буква s встречается один, два или три раза.\r\n\r\n## Регулярные выражения на практике \r\n\r\nВ качестве заключения рассмотрим пару примеров, как регулярные выражения могут использоваться на практике.\r\n\r\n### Проверка номеров телефонов \r\n\r\nДопустим, у нас имеется список номеров телефонов. Корректный формат номера: (nnn) nnn-nnnn. В списке 10 номеров, три номера имеют некорректный формат.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\ncat phonenumbers.txt\r\nOutput:\r\n(185) 136-1035\r\n(95) 213-1874\r\n(37) 207-2639\r\n(285) 227-1602\r\n(275) 298-1043\r\n(107) 204-2197\r\n(799) 240-1839\r\n(218) 750-7390\r\n(114) 776-2276\r\n(7012) 219-3089\n```\n\n \r\n\r\nЗадача — найти неправильные номера. Для этого можно использовать следующую команду:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\ngrep -Ev '^\\([0-9]{3}\\) [0-9]{3}-[0-9]{4} phonenumbers.txt\r\nOutput:\r\n(95) 213-1874\r\n(37) 207-2639\r\n(7012) 219-3089\n```\n\n \r\n\r\nЗдесь мы использовали параметр `-v`, чтобы обратить сопоставление и вывести только строки, не соответствующие указанному выражению. Поскольку круглые скобки считаются метасимволами в ERE, мы экранировали их обратными слешами, чтобы они интерпретировались как литералы.\r\n\r\n### Поиск некорректных имен файлов \r\n\r\nКоманда find поддерживает проверку, основанную на регулярном выражении. Тут важно помнить одну деталь: если grep выводит строку, содержащую совпадение с регулярным выражением, то `find` требует точного совпадения пути. Допустим нам нужно найти в директории имена файлов и каталогов, содержащие пробелы и другие, потенциально вредные символы:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\n```bash\nfind . -regex '.*[^-_./0-9a-zA-Z].*'\n```\n\n \r\n\r\nПоследовательность `.*` в начале и конце означает любое количество любых символов. Такой прием необходим, так как `find` требует совпадения всего пути. В квадратных скобках находится отрицание множества допустимых символов в именах файлов. Таким образом любое имя файла или каталога, содержащее хотя бы один символ, не являющиеся дефисом, подчеркиванием, цифрой или латинской буквой, попадет в вывод.\r\n\r\n---\r\n\r\n**Нужен сервер для практики?** [Арендуйте VPS/VDS в России](/optimalnyij-xosting-dlya-telegram-bota) — root-доступ, NVMe, DDoS-защита и поддержка 24/7."}}