Как использовать регулярные выражения (регулярные выражения) в 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.txtgrep -E -i 'am' geeks.txtПервая команда дает три результата с выделением трех совпадений. Вторая команда дает четыре результата, потому что «Ам» в «Аманде» также совпадает.ЗакреплениеМы можем сопоставить последовательность «Am» и другими способами. Например, мы можем специально искать этот шаблон или игнорировать регистр и указать, что последовательность должна появляться в начале строки.Когда вы сопоставляете последовательности, которые появляются в определенной части строки символов или слова, это называется привязкой. Вы используете каретку (^) символ, обозначающий шаблон поиска, должен рассматривать последовательность символов как совпадающую, только если она появляется в начале строки.Мы вводим следующее (обратите внимание, каретка находится внутри одинарных кавычек):grep -E ‘Am’ geeks.txtgrep -E -i '^am' geeks.txtОбе эти команды соответствуют «Am».Теперь давайте посмотрим на строки, которые содержат двойной символ «n» в конце строки.Набираем следующее, используя знак доллара ($) для представления конца строки:grep -E -i 'nn' geeks.txtgrep -E -i 'nn$' geeks.txtWildcardsВы можете использовать точку ( . ) представлять любой отдельный символ.Мы вводим следующее для поиска шаблонов, которые начинаются с «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.txtgrep -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 '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.txtgrep -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, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)