Как использовать регулярные выражения (регулярные выражения) в Linux

Компьтер-книжка показывая терминал Linux с линиями зеленого текста.
Фатмавати Ахмад Заенури / Shutterstock

Хотите знать, что эти странные строки символов делают в Linux? Они дают вам магию командной строки! Мы научим вас разыгрывать заклинания регулярного выражения и повышать уровень навыков командной строки.

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

Регулярные выражения (регулярные выражения) способ найти соответствующие последовательности символов. Они используют буквы и символы для определения шаблона, который ищется в файле или потоке. Есть несколько различных вкусов от регулярных выражений. Мы рассмотрим версию, используемую в общих утилитах и ​​командах Linux, например grepкоманда, которая печатает строки, соответствующие шаблону поиска,

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

Использовать расширенные регулярные выражения с grep, вы должны использовать -E (расширенный) вариант. Поскольку это становится утомительным очень быстро, egrep Команда была создана. egrep команда такая же, как grep -E комбинация, вам просто не нужно использовать -E вариант каждый раз.

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

Если вам удобнее пользоваться egrep, вы можете. Однако, имейте в виду, что это официально устарело. Он по-прежнему присутствует во всех проверенных нами дистрибутивах, но может исчезнуть в будущем.

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

СВЯЗАННЫЙ: Как создать псевдонимы и функции оболочки в Linux

С малых начал

Для наших примеров мы будем использовать простой текстовый файл, содержащий список вундеркиндов. Помните, что вы можете использовать регулярные выражения со многими командами Linux. Мы просто используем grep как удобный способ продемонстрировать их.

Вот содержимое файла:

less geek.txt

Первая часть файла отображается.

Выход из

Давайте начнем с простого шаблона поиска и поищем в файле вхождения буквы «о». Опять же, потому что мы используем -E (расширенное регулярное выражение) во всех наших примерах мы набираем следующее:

grep -E 'o' geeks.txt

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

У пары имен были двойные O; мы вводим следующее, чтобы перечислить только те:

grep -E 'oo' geeks.txt

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

По мере продвижения вперед мы увидим больше функциональности в наших шаблонах поиска.

Номера строк и другие хитрости

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

Мы вводим следующее:

grep -E -n 'o' geeks.txt

Еще один удобный grep трюк вы можете использовать это -o (только соответствующий) вариант. Он отображает только соответствующую последовательность символов, а не окружающий текст. Это может быть полезно, если вам нужно быстро просканировать список на наличие совпадений в любой из строк.

Для этого набираем следующее:

grep -E -n -o 'o' geeks.txt

Если вы хотите уменьшить выход до минимума, вы можете использовать -c (считать) вариант.

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

grep -E -c 'o' geeks.txt

Оператор чередования

Если вы хотите найти вхождения как двойного «l», так и двойного «o», вы можете использовать трубу (|) символ, который является оператором чередования. Он ищет совпадения для шаблона поиска слева или справа.

Мы вводим следующее:

grep -E -n -o 'll|oo' geeks.txt

Любая строка, содержащая двойное «l», «o» или оба, появляется в результатах.

Чувствительность к регистру

Вы также можете использовать оператор чередования для создания шаблонов поиска, например так:

am|Am

Это будет соответствовать и «ам», и «ам». Для чего-либо, кроме тривиальных примеров, это быстро приводит к громоздким шаблонам поиска. Простой способ обойти это — использовать -i (игнорировать регистр) опция с grep,

Для этого набираем следующее:

grep -E 'am' geeks.txt
grep -E -i 'am' geeks.txt

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

Закрепление

Мы можем сопоставить последовательность «Am» и другими способами. Например, мы можем специально искать этот шаблон или игнорировать регистр и указать, что последовательность должна появляться в начале строки.

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

Мы вводим следующее (обратите внимание, каретка находится внутри одинарных кавычек):

grep -E ‘Am’ geeks.txt

grep -E -i '^am' geeks.txt

Обе эти команды соответствуют «Am».

Теперь давайте посмотрим на строки, которые содержат двойной символ «n» в конце строки.

Набираем следующее, используя знак доллара ($) для представления конца строки:

grep -E -i 'nn' geeks.txt
grep -E -i 'nn$' geeks.txt

Wildcards

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

Мы вводим следующее для поиска шаблонов, которые начинаются с «T», заканчиваются на «m» и имеют один символ между ними:

grep -E 'T.m' geeks.txt

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

Мы набираем следующее, чтобы показать, что нам все равно, какие средние три символа:

grep-E 'J...n' geeks.txt

Строка, содержащая «Jason», сопоставляется и отображается.

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

Это означает, что звездочка (*) будет соответствовать любому числу (включая ноль) вхождений любого символа.

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

В регулярных выражениях, однако, 'c*t' не соответствует «кошка», «детская кроватка», «лысуха» и т. д. Скорее, оно переводится как «соответствовать нулю или большему количеству символов« c », а затем« t »». Таким образом, он соответствует «t», «ct», «cct», «ccct» или любому количеству символов «c».

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

Таким образом, мы вводим следующее, чтобы поиск включал только первые имена из файла:

grep -E 'J.*n ' geeks.txt
grep -E 'J.*n ' geeks.txt

На первый взгляд, результаты первой команды, похоже, содержат некоторые странные совпадения. Однако все они соответствуют правилам шаблона поиска, который мы использовали.

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

Поскольку мы добавили пробел во втором шаблоне поиска, мы получили то, что намеревались: все имена начинаются с «J» и заканчиваются на «n».

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

Допустим, мы хотим найти все строки, которые начинаются с заглавной буквы «N» или «W».

Если мы используем следующую команду, она сопоставляет любую строку с последовательностью, которая начинается с заглавной буквы «N» или «W», независимо от того, где она появляется в строке:

grep -E 'N|W' geeks.txt

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

grep -E '^N|W' geeks.txt

Поиск соответствует строкам, содержащим заглавную букву «W» в любом месте строки. Он также соответствует строке «Нет больше», потому что начинается с заглавной буквы «N». Начало строки привязки (^) применяется только к столице «Н.»

Мы также могли бы добавить начало строки привязки к заглавной букве «W», но это скоро станет неэффективным в шаблоне поиска, более сложном, чем наш простой пример.

Решение состоит в том, чтобы заключить часть нашего шаблона поиска в скобки ([]) и применить оператор привязки к группе. Скобки ([]) означает «любой персонаж из этого списка». Это означает, что мы можем опустить (|) оператор чередования, потому что он нам не нужен.

Мы можем применить начало строки привязки ко всем элементам в списке в скобках ([]). (Обратите внимание, что начало привязки строки находится за пределами скобок).

Мы вводим следующее для поиска любой строки, которая начинается с заглавной буквы «N» или «W»:

grep -E '^[NW]' geeks.txt

Grep -E '^[NW]'geeks.txt

Мы будем использовать эти понятия и в следующем наборе команд.

Мы вводим следующее, чтобы найти кого-нибудь по имени Том или Тим:

grep -E 'T[oi]m' geeks.txt

Если каретка (^) является первым символом в скобках ([]), шаблон поиска ищет любой символ, которого нет в списке.

Например, мы набираем следующее, чтобы найти любое имя, которое начинается с «T» и заканчивается на «m», а средняя буква не «o»:

grep -E 'T[^o]m' geeks.txt

Мы можем включить любое количество символов в список. Мы вводим следующее, чтобы найти имена, начинающиеся с «T», заканчивающиеся на «m» и содержащие любой гласный в середине:

grep -E 'T[aeiou]m' geeks.txt

Интервальные выражения

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

Число само по себе означает именно это число, но если вы будете следовать за ним через запятую (,), это означает, что число или больше. Если вы разделяете два числа запятой (1,2), это означает диапазон чисел от наименьшего до наибольшего.

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

Итак, мы набираем эту команду:

grep -E 'T[aeiou]{1,2}m' geeks.txt

Это соответствует «Тиму», «Тому» и «Команде».

Если мы хотим найти последовательность «el», мы набираем это:

grep -E 'el' geeks.txt

Мы добавляем второй «l» в шаблон поиска, чтобы включить только последовательности, которые содержат двойной «l»:

grep -E 'ell' geeks.txt

Это эквивалентно этой команде:

grep -E 'el{2}' geeks.txt

Если мы предоставим диапазон «по крайней мере один и не более двух» вхождений «l», он будет соответствовать последовательностям «el» и «ell».

Это незначительно отличается от результатов первой из этих четырех команд, в которой все совпадения были для последовательностей «el», в том числе внутри последовательностей «ell» (и только один «l» выделен).

Мы вводим следующее:

grep -E 'el{1,2}' geeks.txt

Чтобы найти все последовательности двух или более гласных, мы набираем эту команду:

grep -E '[aeiou]{2,}' geeks.txt

Убегающие персонажи

Допустим, мы хотим найти строки, в которых точка (.) последний символ Мы знаем знак доллара ($) является привязкой конца строки, поэтому мы могли бы напечатать это:

grep -E '.$' geeks.txt

Однако, как показано ниже, мы не получаем того, что ожидали.

Выход из

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

Итак, как вы мешаете специальному символу выполнять его функцию регулярного выражения, когда вы просто хотите найти этот фактический символ? Для этого вы используете обратную косую черту () убежать от персонажа.

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

Мы вводим следующее:

grep -e '.$' geeks.txt

Это соответствует фактическому периоду символа (.) в конце строки.

Якорь и Слова

Мы покрыли оба начала (^) и конец строки ($якоря выше. Однако вы можете использовать другие якоря для работы с границами слов.

В этом контексте слово — это последовательность символов, ограниченная пробелом (начало или конец строки). Таким образом, «psy66oh» будет считаться словом, хотя вы не найдете его в словаре.

Начало привязки слова (<); обратите внимание, это указывает налево, к началу слова. Допустим, имя было ошибочно напечатано строчными буквами. Мы можем использовать grep -i возможность выполнить поиск без учета регистра и найти имена, начинающиеся с «h».

Мы вводим следующее:

grep -E -i 'h' geeks.txt

Это находит все вхождения «h», а не только те, что в начале слова.

grep -E -i '

Это находит только те, в начале слова.

Давайте сделаем нечто подобное с буквой «у»; мы только хотим видеть случаи, когда это в конце слова. Мы вводим следующее:

grep -E 'y' geeks.txt

Это находит все вхождения «у», где бы он ни появлялся в словах.

Теперь набираем следующее, используя конец слова anchor (/>) (который указывает направо или конец слова):

grep -E 'y>' geeks.txt

Вторая команда дает желаемый результат.

Чтобы создать шаблон поиска, который ищет целое слово, вы можете использовать оператор границы (b). Мы будем использовать граничный оператор (B) на обоих концах шаблона поиска, чтобы найти последовательность символов, которая должна быть внутри большего слова:

grep -E 'bGlennb' geeks.txt
grep -E 'BwayB' geeks.txt

Больше классов персонажей

Вы можете использовать ярлыки для указания списков в классах символов. Эти индикаторы диапазона избавляют вас от необходимости вводить каждый элемент списка в шаблон поиска.

Вы можете использовать все следующее:

  • A-Z: Все заглавные буквы от «А» до «Я».
  • а-г: Все строчные буквы от «а» до «я».
  • 0-9: Все цифры от нуля до девяти.
  • д-р: Все строчные буквы от «d» до «p». Эти стили в произвольном формате позволяют вам определять свой собственный диапазон.
  • 2-7: Все числа от двух до семи.

Вы также можете использовать столько классов символов, сколько хотите в шаблоне поиска. Следующий шаблон поиска сопоставляет последовательности, начинающиеся с «J», за которыми следуют «o» или «s», а затем либо «e», «h», «l» или «s»:

grep -E 'J[os][ehls]' geeks.txt

В нашей следующей команде мы будем использовать a-z спецификатор диапазона.

Наша команда поиска разбивается следующим образом:

  • ЧАС: Последовательность должна начинаться с «H».
  • [a-z]: Следующим символом может быть любая строчная буква в этом диапазоне.
  • *: Звездочка здесь обозначает любое количество строчных букв.
  • человек: Последовательность должна заканчиваться словом «человек».

Мы собрали все это в следующую команду:

grep -E 'H[a-z]*man' geeks.txt

Ничего непроницаемого

Некоторые регулярные выражения могут быстро стать сложными для визуального анализа. Когда люди пишут сложные регулярные выражения, они обычно начинаются с малого и добавляют все больше и больше разделов, пока это не работает. Они имеют тенденцию увеличиваться в сложности с течением времени.

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

Например, посмотрите на эту команду:

grep -E '^([0-9]{4}[- ]){3}[0-9]{4}|[0-9]{16}' geeks.txt

Где бы вы начали распутывать это? Мы начнем с самого начала и возьмем по одному куску за раз:

  • ^: Начало линии привязки. Итак, наша последовательность должна быть первой на очереди.
  • ([0-9]{4}[- ]): Скобки собирают элементы шаблона поиска в группу. Другие операции могут быть применены к этой группе в целом (подробнее об этом позже). Первый элемент - это класс символов, который содержит диапазон цифр от нуля до девяти [0-9], Наш первый символ - цифра от нуля до девяти. Далее у нас есть интервальное выражение, которое содержит число четыре {4}, Это относится к нашему первому персонажу, который, как мы знаем, будет цифрой. Поэтому первая часть шаблона поиска теперь состоит из четырех цифр. За ним может следовать пробел или дефис ([- ]) из другого класса персонажей.
  • {3}: Указатель интервала, содержащий число три, следует сразу за группой. Он применяется ко всей группе, поэтому наш шаблон поиска теперь состоит из четырех цифр, за которыми следует пробел или дефис, который повторяется три раза.
  • [0-9]: Далее у нас есть другой класс символов, который содержит диапазон цифр от нуля до девяти [0-9], Это добавляет еще один символ в шаблон поиска, и это может быть любая цифра от нуля до девяти.
  • {4}: Другое интервальное выражение, которое содержит число четыре, применяется к предыдущему символу. Это означает, что символ становится четырьмя символами, каждый из которых может быть любой цифрой от нуля до девяти.
  • |: Оператор чередования говорит нам, что все слева от него - полный шаблон поиска, а все справа - новый шаблон поиска. Таким образом, эта команда на самом деле ищет один из двух шаблонов поиска. Первая состоит из трех групп по четыре цифры, за которыми следует пробел или дефис, а затем еще четыре цифры.
  • [0-9]: Второй шаблон поиска начинается с любой цифры от нуля до девяти.
  • {16}: Оператор интервала применяется к первому символу и преобразует его в 16 символов, все из которых являются цифрами.

Итак, наш шаблон поиска будет искать одно из следующих:

  • Четыре группы из четырех цифр, каждая из которых разделена пробелом или дефисом (-).
  • Одна группа из шестнадцати цифр.

Результаты показаны ниже.

Этот шаблон поиска ищет общие формы записи номеров кредитных карт. Он также достаточно универсален, чтобы находить разные стили с помощью одной команды.

Помедленней

Сложность, как правило, просто простота. Как только вы поймете основные строительные блоки, вы сможете создавать эффективные, мощные утилиты и развивать ценные новые навыки.

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован.