Регулярные выражения, часто сокращаемые до regex, описывают текстовые шаблоны. Их используют такие инструменты, как grep, sed и awk, однако поддерживаемый синтаксис может различаться, поэтому всегда учитывайте конкретный инструмент и разновидность регулярных выражений.
Продвинутый Text-Fu · Урок 1
Регулярные выражения (regex)
Узнайте, как якоря, наборы символов, повторения и разновидности regex управляют поиском по текстовым шаблонам.
GNU grep по умолчанию использует базовые регулярные выражения (BRE), а с параметром -E — расширенные (ERE). В этом уроке сначала рассматриваются конструкции, общие для обоих вариантов, а затем — распространённые дополнения ERE.
В примерах будем использовать следующий текст:
sally sells seashells
by the seashore
Сопоставление с буквальным текстом
Большинство обычных символов обозначают сами себя. Шаблон seashells выбирает строку, в которой эта последовательность встречается в любом месте:
$ grep 'seashells' sample.txt
sally sells seashells
Заключайте регулярные выражения в кавычки, чтобы оболочка не раскрыла и не разделила их до передачи инструменту поиска. Регулярные выражения также отличаются от подстановки путей в оболочке: в regex символ * повторяет предшествующий элемент, а в шаблоне оболочки * сам служит подстановочным знаком для последовательности символов в пути.
Что делает * в регулярном выражении ab*?
Привязка совпадения
Вне выражения в квадратных скобках символ ^ в начале шаблона привязывает совпадение к началу строки:
^by
Якорь $ соответствует концу строки:
seashore$
Используйте оба якоря, когда шаблону должна соответствовать вся строка целиком:
^by the seashore$
Какой шаблон соответствует только строке, полный текст которой — by the seashore?
Сопоставление с одним символом
В обычном построчном режиме regex точка соответствует одному символу:
b.
Такой шаблон соответствует by, но также может совпасть с ba или b7. Одинокая b не подойдёт, поскольку после неё требуется ещё один символ. Для поиска самой точки экранируйте её как \. или поместите в подходящее выражение в квадратных скобках.
Какая строка не соответствует шаблону полной строки ^b.$?
Выражения в квадратных скобках
Выражение в квадратных скобках соответствует одному символу из указанного набора:
s[ae]lls
В этой позиции шаблон может соответствовать sells или salls.
Если ^ стоит первым символом после [, он инвертирует набор:
s[^e]lls
Этот шаблон соответствует salls, но не sells, поскольку символ после первой s не может быть e.
Чему соответствует [^e]?
Диапазоны позволяют описать символы между двумя границами:
d[a-c]g
Шаблон может соответствовать dag, dbg или dcg. Поведение диапазонов способно зависеть от правил сортировки текущей локали. Классы символов [[:lower:]], [[:upper:]] и [[:digit:]] часто яснее выражают намерение.
Повторение и объединение шаблонов
И в BRE, и в ERE символ * означает ноль или более повторений предшествующего элемента:
seashells*
Шаблон соответствует seashell, после которого может идти любое количество дополнительных символов s, включая ноль. В режиме ERE, включаемом через grep -E, распространены следующие операторы:
+: одно или более повторений.?: ноль или одно повторение.|: выражение слева или выражение справа.(...): группировка выражений.
Например:
$ grep -E '^(cat|dog)s?$' animals.txt
Команда выбирает строки, целиком равные cat, cats, dog или dogs. В режиме BRE правила экранирования этих операторов отличаются, поэтому не переносите шаблон из одной разновидности regex в другую, не сверившись с синтаксисом.
Какая команда включает расширенный синтаксис regex для шаблона ^(cat|dog)s?$?
Закрепить выбор текста с помощью инструментов Linux можно в практических лабораториях:
- Поиск текста с помощью grep в Linux — вы научитесь искать текст командой
grep, выводить номера строк, применять якоря^и$, а также использовать базовые и расширенные регулярные выражения для сложного поиска по шаблону. - Обработка текста и регулярные выражения — познакомьтесь с инструментами grep, sed и awk и примените регулярные выражения для эффективной обработки текста в Linux.
- Извлечение адресов и чисел — используйте grep и регулярные выражения для извлечения адресов электронной почты и чисел из файла.
Урок завершён
Вы завершили Регулярные выражения (regex)
Теперь вы умеете читать и составлять базовые построчные регулярные выражения.
Отличать операторы regex от подстановочных знаков путей в оболочке.
Привязывать совпадение к началу или концу строки.
Сопоставлять один символ с помощью точки или выражения в скобках.
Инвертировать наборы и применять классы символов с учётом локали.
Осознанно выбирать синтаксис BRE или ERE.
Сохраните прогресс
Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.
Создать бесплатный аккаунт