Как начать работу с регулярными выражениями в терминале Linux

Как начать работу с регулярными выражениями в терминале Linux

Поиск в вашей файловой системе может быть сложным. Например, вам иногда бывает трудно быть конкретный or точный? Или, может быть, он слишком шумный? Regex может решить эти и другие проблемы. Он мощный, универсальный и гибкий, и его основы проведут вас очень долгий путь.

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

Regex — это язык сопоставления шаблонов; это способ выразительно описывать шаблоны, которые соответствуют строкам (например, словам или предложениям). Например, предположим, что вы ищете на жестком диске изображение под названием Foo, но вы не можете вспомнить, JPEG это или PNG. Мы можем использовать regex с fd следующим образом: fd ‘foo.(jpg|png)’.

Многие утилиты используют регулярные выражения для поиска, преобразования и взаимодействия с текстом. Например, grep -E [регулярное выражение], найти -regex [регулярное выражение] или fd [регулярное выражение]. Использование регулярных выражений означает, что вы можете быть очень точный.

Regex используется везде. Большинство веб-сайтов в Интернете используют его в той или иной форме. Regex также распространен в утилитах и ​​приложениях, таких как ripgrep, Vim, Neovim, Emacs и многих других.

Как начать работу с регулярными выражениями в терминале Linux

Различные разновидности регулярных выражений

Regex бывает разных видов, что по сути означает разные правила (иначе говоря, синтаксис). Существует много видов, но они отличаются лишь в небольших деталях. Если вы будете придерживаться концепций, которые я рассмотрю позже, они будут работать в большинстве видов и утилит Linux. Вам не нужно слишком много думать об этом.

PCRE (Perl Compatible Regular Expressions) — наиболее полнофункциональный вариант. Все примеры пытаются быть совместимыми с PCRE.

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

Краткий обзор регулярных выражений, который развеет все тайны

Следующий список познакомит вас с общими функциями регулярных выражений:

Концепция

Описание

Классы персонажей

Список определенных символов, которые вы хотите сопоставить, например, [абв].

Группы соответствия

Скобки вокруг связанных частей выражения, как скобки в математике, например, (фу).

Модификаторы

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

Якоря

Определите начало и конец строки, например, ^фу$.

Кванторы

Укажите количество, например, фу+, фу{3}, и т.д.

перемежаемость

Просто or заявление, например, фу|бар.

Метасимвол DOTALL

Совпадение с чем угодно, например с подстановочным знаком — это просто одна точка.

Вы будете смешивать и сочетать их, чтобы описать узор.

Эти функции применяются повсеместно, только если вы используете их с флагами команд, упомянутыми далее. Например, grep -P foo.

Метаперсонаж DOTALL: сопоставьте все и вся

Метасимвол DOTALL подобен подстановочному знаку, потому что он соответствует всему. Это просто точка. Вы будете часто использовать его в местах, где он должен соответствовать чему угодно.

Как начать работу с регулярными выражениями в терминале Linux

Классы персонажей: сопоставление определенных персонажей в любом порядке

Классы символов — это список символов, заключенных в квадратные скобки, которые вы хотите сопоставить. Например, следующее выражение соответствует а, б, я, 1, 2 или 9:

[abz129]

Соответствует любому буквенно-цифровому символу, в верхнем или нижнем регистре:

[a-zA-Z0-9]

Дефис (-) имеет особое значение в классе символов, поэтому, если вы хотите сопоставить его буквально, вы должны поместить его в начало. [-аз] или избежать этого [аз-].

Опять же, важно понимать, что класс символов соответствует ровно одному символу, если только вы не используете квантификатор (рассмотренный позже).

Как начать работу с регулярными выражениями в терминале Linux

В поле результатов вы можете увидеть несколько выделенных символов. Каждое совпадение соответствует одному из символов в классе символов.

Если внимательно посмотреть на поле результатов на изображении, то можно увидеть, что один класс символов соответствует нескольким символам. За это отвечает глобальный режим (g). Глобальный режим означает, что регулярное выражение не останавливается на первом совпадении, а вместо этого продолжает и создает несколько совпадений.

Группы соответствия: рисование границ вокруг подвыражений

В некотором смысле группы соответствия похожи на скобки в математике. Например, когда вы пишете математическое выражение типа 1 + (2 / 2), он отличается от (1 + 2) / 2. Расчет начинается с самых внутренних скобок, что меняет результат.

Скобки в регулярных выражениях работают как границы; они группируют части выражения вместе. Например, фу(бар|баз) это не то же самое, что foobar|баз, потому что первое будет соответствовать Foobar or фобаз; последнее будет соответствовать Foobar or Баз.

Закрыто

Квантификаторы: как указать точные и переменные суммы

Квантификаторы позволяют нам определять количества. Когда мы сопоставляем символ с DOTALL или классами символов, мы используем квантификаторы, чтобы сказать, сколько. Мы также можем применять квантификаторы для сопоставления групп, поэтому мы можем определять количества для целых выражений.

Сопоставьте ноль или более вещей со звездочкой

Метасимвол звездочки (*) будет соответствовать нулю или более вещей. Следующие совпадения а, б, з, или пустая строка:

[абз]*

Сопоставьте одно или несколько значений со знаком плюс

Метасимвол плюс (+) будет соответствовать одному или нескольким вещам. Следующее соответствует одному или нескольким а, б или я персонажи:

[абз]+

Сделайте вещи необязательными с помощью вопросительного знака

Метасимвол вопроса (?) делает предыдущий элемент необязательным. Следующий будет соответствовать только одному а, б, з, или вообще ничего:

[абз]?

Определите точное количество с помощью фигурных скобок

Фигурные скобки позволяют нам определить точное число. Например, следующее будет соответствовать а, б или я ровно дважды:

[абз]{2}

Следующее будет соответствовать а, б или я от 2 до 4 раз:

[абз]{2,4}

Краткое изложение квантификаторов

  • ?: Необязательный.
  • *: Ноль или более (ноль означает пустую строку).
  • +: Один или несколько.
  • {n,m}: Соответствие между n и m предметы.

Метасимволы плюс (+) и вопросительный знак (?) не работают с большинством утилит Linux, если вы не используете соответствующие флаги команд. Флаги будут рассмотрены позже.

Найдите столько совпадений, сколько захотите, с помощью ленивых и жадных квантификаторов

Некоторые квантификаторы позволяют нам определить неопределенное количество. Например, знак плюс (+) означает один или больше— все, что больше 0. Метасимволы плюс (+) и звездочка (*) жадный по умолчанию, что означает, что они пытаются соответствовать как можно большему количеству. В противоположность этому, мы можем сделать их ленивый чтобы они совпадали как можно меньше.

Добавление вопросительного знака (?) делает их ленивыми. Например, следующее будет соответствовать а, б или з, но он остановится после первого совпадения (он ленивый).

[абз]+?

Метасимвол звездочки (*) похож, за исключением одной маленькой детали: он соответствует нулю или более элементов. Самое ленивое соответствие — ноль, поэтому следующее не будет соответствовать ничему.

[абз]*?

Закрыто

Сделать квантификатор ленивым может быть более производительным, поскольку ему не нужно обрабатывать всю строку. Если вы ищете миллионы строк, сопоставление только первых нескольких символов может сэкономить много времени и ресурсов.

Якоря соответствуют началу и концу строк

Якоря просты для понимания. Их два, один из которых указывает на Начало линии (^) и той, которая указывает конец ($). Следующий шаблон соответствует Foo именно и ничего больше:

^фу$

Как начать работу с регулярными выражениями в терминале Linux

Модификаторы: флаги, которые изменяют работу регулярных выражений

Модификаторы — это способ изменить работу регулярных выражений. Например, мы можем сделать его чувствительным к регистру. Мы уже рассмотрели глобальный модификатор, но стоит еще раз отметить, что это флаги, которые обычно располагаются в конце выражения.

Как начать работу с регулярными выражениями в терминале Linux

Глобальный модификатор

Глобальный модификатор (g) позволяет регулярному выражению продолжать поиск совпадений после того, как оно находит первое, что приводит к нескольким совпадениям. Напротив, отключение глобального модификатора заставляет регулярное выражение остановиться после нахождения первого совпадения.

Как начать работу с регулярными выражениями в терминале Linux

Это выражение соответствует отдельным заглавным буквам и цифрам. Оно игнорирует строчные буквы. Поскольку глобальный модификатор (g) активен, оно соответствует нескольким элементам.

Как начать работу с регулярными выражениями в терминале Linux

Модификатор нечувствительности к регистру

Модификатор учета регистра (i) при активации будет сопоставлять как заглавные, так и строчные буквы.

Как начать работу с регулярными выражениями в терминале Linux

Многострочный модификатор

Якоря определяют начало (^) и конец ($) строки. Когда активен модификатор многострочности (m), якоря соответствуют началу и концу каждой линия. Когда он неактивен, якоря соответствуют вся строка.

Вот как ведут себя якоря при включенном многострочном режиме. активный:

^фу$
^бар$

И когда это неактивный:

^ foo
бары$

Чтобы оценить все строки, когда активен модификатор многострочности (m), необходимо также включить глобальный модификатор (g). Но помните, что это также создаст несколько совпадений.

Закрыто

Собираем все вместе: использование регулярных выражений с командами

Итак, теперь грандиозный финал: как нам применить то, чему мы научились, на пользу? Как упоминалось в начале, find, fd, grep, ripgrep и sed поддерживают регулярные выражения. Обратите внимание на флаги команд, которые я использую; я выбрал их так, чтобы они использовали похожие варианты.

Для каждой команды я буду использовать следующее выражение:

^.+/[fo]+.(jpg|png)$

Этот шаблон соответствует пути POSIX для файла JPG или PNG. Например:

/foo/bar/baz/foo.jpg

Это выражение охватывает все, что мы узнали: якоря, классы символов, квантификаторы, чередование, группы соответствия и метасимвол DOTALL. Вот краткое содержание выражения (в порядке появления):

Segment

Внимание

^

Найдите соответствие началу строки.

.+

Найдите любой символ, повторенный один или несколько раз.

/

Соответствует косой черте перед именем файла. Это буквальный слэш определяет четкую границу для нашего имени файла, а предыдущий DOTALL будет соответствовать всем остальным символам пути (включая слэши).

[fo]+

Сопоставьте буквы f и o один или несколько раз, например, фу, фу, фу, фу, фу-фу.

.

Сопоставьте буквальный точка (не DOTALL).

(jpg|png)

Группа соответствия; я использовал ее здесь, чтобы сгруппировать эти два шаблона вместе. Трубка называется чередованием, и использование ее таким образом означает jpg или png.

$

Найдите конец строки.

Я сопоставлю все выражения с файлом (называется Примеры реализованных проектов) со следующим содержанием:

/foo/bar/baz/foo.jpg
/один/два/thr/foo.png

/это/не/должно/соответствовать.jpg

Для команд поиска я создам такие файлы в своей файловой системе и выполню их поиск.

Использование grep с регулярными выражениями

Для grep мы должны использовать -P флаг, который включает его (ограниченный) движок PCRE. PCRE — самая обширная разновидность, поддерживающая почти все функции, которые только можно себе представить.

Как начать работу с регулярными выражениями в терминале Linux

Если вы не знакомы с grep, ознакомьтесь с этим подробным руководством по его использованию.

Использование find с регулярным выражением

Команда find поддерживает несколько разновидностей регулярных выражений. Вы можете просмотреть их список с помощью следующей команды:

найти -regextype помощь

Вкус, который наиболее близок к PCRE, это posix-расширенный, Ака POSIX ЭРЕ (Расширенные регулярные выражения). В POSIX ERE отсутствуют многие расширенные функции, но он поддерживает все функции, которые мы рассмотрели.

Как начать работу с регулярными выражениями в терминале Linux

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

Использование fd с регулярным выражением

Команда fd использует regex Rust crate (пакет Rust). Regex crate почти совместим с PCRE, поэтому мы можем использовать его без особых проблем. Однако по умолчанию fd сопоставляет только имена файлов, поэтому мы должны использовать —полный путь флаг, если мы хотим сопоставить весь путь к файлу.

Как начать работу с регулярными выражениями в терминале Linux

Использование ripgrep с регулярными выражениями

Использование regex с командой ripgrep просто, поскольку она использует regex Rust crate. Как упоминалось ранее, Rust crate очень похож на PCRE.

Как начать работу с регулярными выражениями в терминале Linux

Использование sed с регулярными выражениями

Команда sed отличается от других; она позволяет нам искать и заменять строки. Если вы с ней не знакомы, вам стоит ознакомиться с этим прекрасным руководством по использованию команды sed. Общая форма команды выглядит следующим образом:

s/шаблон/замена/

Не обязательно использовать прямые слеши, поскольку вы можете использовать любой символ, который пожелаете. В примере ниже я использовал символ вертикальной черты вместо прямых слешей, чтобы не путать sed. Использование вертикальной черты означает, что мне не нужно экранировать прямые слеши в предоставленном заменяющем значении (пути).

Для sed нам нужно использовать вариант регулярных выражений GNU ERE, и мы делаем это с помощью -E флаг. Все, что работает в GNU ERE, будет работать и в PCRE, что хорошо для нас.

Как начать работу с регулярными выражениями в терминале Linux

Номер 1 — это шаблон. Номер 2 — желаемое значение для замены совпавших строк. Номер 3 показывает совпавшие строки, замененные новым значением. Номер 4 — это строка из файла, которая не совпала и осталась неизмененной.

В этом примере я извлек результаты и заменил пути к файлам, подобно тому, как работают cat и grep, но sed также поддерживает редактирование на месте с помощью флага -i.

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

В дополнение к этому, regex — это то, что вам нужно освоить, прежде чем это действительно будет иметь смысл. Вы можете практиковать свои навыки, получать идеи и узнавать больше через regex101, мощную онлайн-площадку, которая предоставляет советы и рекомендации.

Как начать работу с регулярными выражениями в терминале Linux

Валентин Павлов/ автор статьи
Страсть Влентина к играм началась с Resident Evil, и с тех пор он не переставал играть в хоррор-игры. Пишет экспертные руководства для самых сложных игр и обзоры для самых громких релизов. Является магистром журналистики и имеет степень бакалавра лингвистики. Любимые игры: GTA 5, Silent Hill 2, Call of Duty: Modern Warfare 2, Heavy Rain, Metro 2033 и другие.
Понравилась статья? Поделиться с друзьями:
Добавить комментарий