Linux bash регулярные выражения

Глава 18. Регулярные выражения

Для того, чтобы полностью реализовать потенциал командной оболочки, вам придется овладеть Регулярными Выражениями. Многие команды и утилиты, обычно используемые в сценариях, такие как grep, expr, sed и awk, используют Регулярные Выражения.

18.1. Краткое введение в регулярные выражения

Выражение — это строка символов. Символы, которые имеют особое назначение, называются метасимволами . Так, например, кавычки могут выделять прямую речь, т.е. быть метасимволами для строки, заключенной в эти кавычки. Регулярные выражения — это набор символов и/или метасимволов, которые наделены особыми свойствами. [1]

Основное назначение регулярных выражений — это поиск текста по шаблону и работа со строками.

Звездочка — * — означает любое количество символов в строке, предшествующих «звездочке», в том числе и нулевое число символов .

Выражение «1133*» — означает 11 + один или более символов «3» + любые другие символы: 113, 1133, 113312, и так далее.

Точка — . — означает не менее одного любого символа, за исключением символа перевода строки (\n). [2]

Выражение «13.» будет означать 13 + по меньшей мере один любой символ (включая пробел): 1133, 11333, но не 13 (отсутствуют дополнительные символы).

Символ — ^ — означает начало строки, но иногда, в зависимости от контекста, означает отрицание в регулярных выражениях.

Знак доллара — $ — в конце регулярного выражения соответствует концу строки.

Выражение «^$» соответствует пустой строке.

Символы ^ и $ иногда еще называют якорями , поскольку они означают, или закрепляют, позицию в регулярных выражениях.

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

Выражение «[xyz]» — соответствует одному из символов x, y или z.

Выражение «[c-n]» соответствует одному из символов в диапазоне от c до n, включительно.

Выражение «[B-Pk-y]» соответствует одному из символов в диапазоне от B до P или в диапазоне от k до y, включительно.

Выражение «[a-z0-9]» соответствует одному из символов латиницы в нижнем регистре или цифре.

Выражение «[^b-d]» соответствует любому символу, кроме символов из диапазона от b до d, включительно. В данном случае, метасимвол ^ означает отрицание.

Объединяя квадратные скобки в одну последовательность, можно задать шаблон искомого слова. Так, выражение «[Yy][Ee][Ss]» соответствует словам yes, Yes, YES, yEs и так далее. Выражение «455-51-2981» определяет шаблон для поиска любого номера карточки социального страхования (для США).

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

Комбинация «\$» указывает на то, что символ «$» трактуется как обычный символ, а не как признак конца строки в регулярных выражениях. Аналогично, комбинация «\\» соответствует простому символу «\» .

Экранированные «угловые скобки» — \ — отмечают границы слова.

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

Выражение «\ » соответствует слову «the» , и не соответствует словам «them» , «there» , «other» и т.п.

Дополнительные метасимволы. Использующиеся при работе с egrep, awk и Perl

Знак вопроса — ? — означает, что предыдущий символ или регулярное выражение встречается 0 или 1 раз. В основном используется для поиска одиночных символов.

Знак «плюс» — + — указывает на то, что предыдущий символ или выражение встречается 1 или более раз. Играет ту же роль, что и символ «звездочка» ( * ), за исключением случая нулевого количества вхождений.

Экранированные «фигурные скобки» — \ < \>— задают число вхождений предыдущего выражения.

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

Выражение «8\<5\>» — в точности соответствует подстроке из пяти десятичных цифр (символов из диапазона от 0 до 9, включительно).

В «классической» (не совместимой с POSIX) версии awk, фигурные скобки не могут быть использованы. Однако, в gawk предусмотрен ключ —re-interval, который позволяет использовать (неэкранированные) фигурные скобки.

Язык программирования Perl и некоторые версии egrep не требуют экранирования фигурных скобок.

Круглые скобки — ( ) — предназначены для выделения групп регулярных выражений. Они полезны при использовании с оператором » | » и при извлечении подстроки с помощью команды expr.

Вертикальная черта — | — выполняет роль логического оператора «ИЛИ» в регулярных выражениях и служит для задания набора альтернатив.

Некоторые версии sed, ed и ex поддерживают экранированные версии регулярных выражений, описанных выше.

Классы символов POSIX. [:class:]

Это альтернативный способ указания диапазона символов.

Класс [:alnum:] — соответствует алфавитным символам и цифрам. Эквивалентно выражению [A-Za-z0-9].

Класс [:alpha:] — соответствует символам алфавита. Эквивалентно выражению [A-Za-z].

Класс [:blank:] — соответствует символу пробела или символу табуляции.

Класс [:cntrl:] — соответствует управляющим символам (control characters).

Класс [:digit:] — соответствует набору десятичных цифр. Эквивалентно выражению 9.

Класс [:graph:] (печатаемые и псевдографические символы) — соответствует набору символов из диапазона ASCII 33 — 126. Это то же самое, что и класс [:print:], за исключением символа пробела.

Класс [:lower:] — соответствует набору алфавитных символов в нижнем регистре. Эквивалентно выражению [a-z].

Класс [:print:] (печатаемые символы) — соответствует набору символов из диапазона ASCII 32 — 126. По своему составу этот класс идентичен классу [:graph:], описанному выше, за исключением того, что в этом классе дополнительно присутствует символ пробела.

Класс [:space:] — соответствует пробельным символам (пробел и горизонтальная табуляция).

Класс [:upper:] — соответствует набору символов алфавита в верхнем регистре. Эквивалентно выражению [A-Z].

Класс [:xdigit:] — соответствует набору шестнадцатиричных цифр. Эквивалентно выражению [0-9A-Fa-f].

Вообще, символьные классы POSIX требуют заключения в кавычки или двойные квадратные скобки ([[ ]]).

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

Примеры использования символьных классов в сценариях вы найдете в Пример 12-14 и Пример 12-15.

Sed, awk и Perl, используемые в сценариях в качестве фильтров, могут принимать регулярные выражения в качестве входных аргументов. См. Пример A-13 и Пример A-19.

Книга «Sed & Awk» (авторы Dougherty и Robbins) дает полное и ясное представление о регулярных выражениях (см. раздел Литература).

Примечания

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

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

Источник

Регулярные выражения в Grep (Regex)

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

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

Регулярное выражение Grep

Регулярное выражение или регулярное выражение — это шаблон, который соответствует набору строк. Шаблон состоит из операторов, конструирует буквальные символы и метасимволы, которые имеют особое значение. GNU grep поддерживает три синтаксиса регулярных выражений: базовый, расширенный и Perl-совместимый.

В своей простейшей форме, когда тип регулярного выражения не указан, grep интерпретирует шаблоны поиска как базовые регулярные выражения. Чтобы интерпретировать шаблон как расширенное регулярное выражение, используйте параметр -E (или —extended-regexp ).

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

Буквальные совпадения

Наиболее простое использование команды grep — поиск буквального символа или серии символов в файле. Например, чтобы отобразить все строки, содержащие строку «bash» в /etc/passwd , вы должны выполнить следующую команду:

Результат должен выглядеть примерно так:

В этом примере строка «bash» представляет собой базовое регулярное выражение, состоящее из четырех буквальных символов. Это указывает grep искать строку, в которой сразу после grep «b» идут «a», «s» и «h».

По умолчанию команда grep чувствительна к регистру. Это означает, что символы верхнего и нижнего регистра рассматриваются как разные.

Чтобы игнорировать регистр при поиске, используйте параметр -i (или —ignore-case ).

Важно отметить, что grep ищет шаблон поиска как строку, а не слово. Итак, если вы искали «gnu», grep также напечатает строки, в которых «gnu» встроено в слова большего размера, например, «cygnus» или «magnum».

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

Якорь

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

Символ ^ (каретка) соответствует пустой строке в начале строки. В следующем примере строка «linux» будет соответствовать только в том случае, если она встречается в самом начале строки.

Символ $ (доллар) соответствует пустой строке в начале строки. Чтобы найти строку, заканчивающуюся строкой «linux», вы должны использовать:

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

Еще один полезный пример — шаблон ^$ , который соответствует всем пустым строкам.

Соответствующий одиночный символ

Файл . (точка) символ — это метасимвол, который соответствует любому одиночному символу. Например, чтобы сопоставить все, что начинается с «кан», затем имеет два символа и заканчивается строкой «ру», вы должны использовать следующий шаблон:

Выражения в скобках

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

Если первый символ внутри скобок — это курсор ^ , то он соответствует любому одиночному символу, не заключенному в скобки. Следующий шаблон будет соответствовать любой комбинации строк, начинающихся с «co», за которыми следует любая буква, кроме «l», за которой следует «la», например «coca», «cobalt» и т. Д., Но не будет соответствовать строкам, содержащим «cola». ”:

Вместо того, чтобы помещать символы по одному, вы можете указать диапазон символов внутри скобок. Выражение диапазона создается путем указания первого и последнего символов диапазона, разделенных дефисом. Например, [aa] эквивалентно [abcde] а 3 эквивалентно [123] .

Следующее выражение соответствует каждой строке, начинающейся с заглавной буквы:

grep также поддерживает предопределенные классы символов, заключенные в скобки. В следующей таблице показаны некоторые из наиболее распространенных классов символов:

Квантификатор Классы персонажей
[:alnum:] Буквенно-цифровые символы.
[:alpha:] Буквенные символы.
[:blank:] Пробел и табуляция.
[:digit:] Цифры.
[:lower:] Строчные буквы.
[:upper:] Заглавные буквы.

Полный список всех классов персонажей можно найти в руководстве по Grep .

Квантификаторы

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

Квантификатор Описание
* Сопоставьте предыдущий элемент ноль или более раз.
? Соответствует предыдущему элементу ноль или один раз.
+ Сопоставьте предыдущий элемент один или несколько раз.
Сравните предыдущий элемент ровно n раз.
Сопоставьте предыдущий элемент не менее n раз.
Соответствовать предыдущему элементу не более m раз.
Сопоставьте предыдущий элемент от n до m раз.

Символ * (звездочка) соответствует предыдущему элементу ноль или более раз. Следующее будет соответствовать «right», «sright», «ssright» и так далее:

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

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

Вот то же регулярное выражение с использованием расширенного регулярного выражения:

Символ + (плюс) соответствует предыдущему элементу один или несколько раз. Следующее будет соответствовать «sright» и «ssright», но не «right»:

Фигурные скобки <> позволяют указать точное число, верхнюю или нижнюю границу или диапазон вхождений, которые должны произойти, чтобы совпадение произошло.

Следующее соответствует всем целым числам, содержащим от 3 до 9 цифр:

Чередование

Термин «чередование» представляет собой простое «ИЛИ». Оператор чередования | (pipe) позволяет вам указать различные возможные совпадения, которые могут быть буквальными строками или наборами выражений. Этот оператор имеет самый низкий приоритет среди всех операторов регулярных выражений.

В приведенном ниже примере мы ищем все вхождения слов fatal , error и critical в файле ошибок журнала Nginx :

Если вы используете расширенное регулярное выражение, то оператор | не следует экранировать, как показано ниже:

Группировка

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

При использовании основных регулярных выражений скобки должны быть экранированы обратной косой чертой ( ).

Следующий пример соответствует как «бесстрашный», так и «меньший». ? квантификатор делает группу (fear) необязательной:

Специальные выражения обратной косой черты

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

Выражение Описание
b Сопоставьте границу слова.
Соответствует пустой строке в начале слова.
> Соответствует пустой строке в конце слова.
w Подберите слово.
s Подберите пробел.

Следующий шаблон будет соответствовать отдельным словам «abject» и «object». Он не будет соответствовать словам, если вложен в слова большего размера:

Выводы

Регулярные выражения используются в текстовых редакторах, языках программирования и инструментах командной строки, таких как grep , sed и awk . Знание того, как создавать регулярные выражения, может быть очень полезным при поиске текстовых файлов, написании сценариев или фильтрации вывода команд.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

Читайте также:  Запустить оболочку windows командой
Оцените статью