Использование регулярных выражений в Linux

Регулярные выражения значительно расширяют возможности Linux

    Регулярные выражения значительно расширяют возможности:
    Настройте правила синтаксического анализа запросов на HTTP-серверах, в частности на nginx. Напишите скрипты для преобразования текстовых наборов данных в другой формат. Выполняйте поиск интересующих вас фрагментов в записях журналов или документах. Фильтруйте документы с разметкой, сохраняя семантическое содержимое.


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

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

    Существует еще один тип атома — выражение в квадратных скобках. Хотя скобки [] (включая их содержимое) не являются отдельным символом, они считаются одним атомом.
    Выражение в квадратных скобках обычно представляет собой список буквенных символов, заключенных в [], и соответствует любому отдельному символу из этого списка. Например, выражение [1b] можно найти в строках abcd и a1cd
    Чтобы указать символы, которым атом не должен соответствовать, список должен начинаться с ^, как в [^1b]
    В выражениях в квадратных скобках также можно указывать диапазоны символов. Например, [0−9] соответствует цифрам от 0 до 9, а [a−z] — любой строчной букве. Диапазоны следует использовать с осторожностью, так как они могут различаться в разных локализованных версиях.


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

    [:alnum:] Представляет собой буквенно-цифровой символ. [:alpha:] Обозначает буквенный символ. [:ascii:] Представляет собой символ, входящий в набор символов ASCII. [:blank:] Представляет собой пустой символ, то есть пробел или табуляцию. [:cntrl:] Представляет собой управляющий символ. [:digit:] Обозначает цифру (от 0 до 9). [:graph:] Представляет собой любой печатный символ, кроме пробела. [:lower:] Представляет собой строчную букву. [:print:] Представляет собой любой печатный символ, включая пробел. [:punct:] Представляет собой любой печатный символ, не являющийся пробелом или буквенно-цифровым символом. [:space:] Обозначает символы пробела: пробел, возврат каретки (\f), перевод строки (\n), возврат к предыдущей позиции (\r), горизонтальный отступ (\t), вертикальный отступ (\v). [:upper:] Обозначает заглавную букву. [:xdigit:] Представляет собой шестнадцатеричные цифры (от 0 до F).

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

    Кванторы

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


    Границы

    bound — это квантификатор атома, который, как следует из названия, позволяет пользователю указать точные количественные границы для атома.
    В расширенных регулярных выражениях квантификатор может принимать три формы:
    {i}
    Атом должен встречаться ровно i раз (i — целое число). Например, [[:blank:]]{2} соответствует ровно двум пробелам.


    {i,}
    Атом должен встречаться не менее i раз (i — целое число). Например, [[:blank:]]{2,} соответствует любой последовательности из двух или более пробельных символов.

    {i,j}
    Атом должен встречаться не менее i раз и не более j раз (i и j — целые числа, j больше i). Например, xyz{2,4} соответствует строке xy, за которой следуют от двух до четырех символов z .

    В любом случае, если подстрока соответствует регулярному выражению и при этом более длинная подстрока, начинающаяся с того же места, тоже соответствует, то будет учитываться более длинная подстрока.
    Базовые регулярные выражения также поддерживают границы, но перед разделителями должны стоять символы \: \{ и \}. Сами по себе { и } интерпретируются как обычные символы. Символ \{, за которым следует любой символ, кроме цифры, является обычным символом, а не началом границы.

    Branches and Back References

    Базовые регулярные выражения также отличаются от расширенных регулярных выражений еще одним важным аспектом: расширенное регулярное выражение можно разделить на ветви, каждая из которых представляет собой отдельное регулярное выражение. Ветви разделяются символом |, и объединенное регулярное выражение будет соответствовать любому из его фрагментов. Например, he|him будет соответствовать подстроке he или him в анализируемой строке.
    Однако большинство программ, поддерживающих базовые регулярные выражения, допускают использование ветвей с \|.


    Расширенное регулярное выражение, заключенное в (), может использоваться в обратной ссылке.
    Расширенное регулярное выражение, заключенное в (), может использоваться в обратной ссылке. Например, ([[:digit:]])\1 будет соответствовать любому регулярному выражению, которое повторяется хотя бы один раз, поскольку \1 в выражении является обратной ссылкой на часть, соответствующую первому подвыражению в скобках. Если в регулярном выражении несколько подвыражений в скобках, на них можно ссылаться с помощью \2, \3 и так далее.

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

    Обратная ссылка (англ. backreference) — механизм повторного использования групп или слов группы.

    Пример: (ab(cd))(ef).
    Группа №1
    — (ab(cd)),
    группа №2
    — (cd),
    группа №3
    — (ef)

    Поиск с помощью регулярных выражений

    Опция -regex команды find позволяет проверить соответствие каждого пути в иерархии каталогов регулярному выражению

    #скрытые файлы или файлы в скрытых каталогах find $HOME -regex '.*/\..*' -size +100M

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

    #будет соответствовать любому адресу электронной почты egrep "\S+@\S+\.\S+" #будет соответствовать только любому IPv4-адресу egrep "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" #вывести содержимое файла /etc/services, исключив все комментарии grep -v ^# /etc/services #вывести список только .org или .com доменов egrep ".org$|.com$" domains.txt #для поиска всех файлов, не имеющих стандартного расширения find . -type f -regextype egrep -not -regex '.*\.[[:alnum:]]{1,}$'

    Команда less по умолчанию используется для разбиения на страницы при отображении длинных текстовых файлов в командной оболочке. Набрав /, можно ввести регулярное выражение в строке поиска, чтобы перейти к первому соответствующему совпадению. Какую комбинацию клавиш нужно ввести в строке поиска, чтобы остаться на текущей позиции в документе и выделить только соответствующие совпадения? Нажатие Ctrl+K перед вводом поискового запроса.


    В less как можно отфильтровать вывод, чтобы отображались только строки, соответствующие регулярному выражению? Для этого нажмите & и введите поисковый запрос.

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


    #только строки с параметрами grep '^options' /etc/modprobe.d/alsa-base.conf options bt87x index=-2 options cx88_alsa index=-2 options saa7134-alsa index=-2 options snd-atiixp-modem index=-2 options snd-intel8x0m index=-2 .... #строки из fdisk -l вывода, начинающиеся с Disk /dev/sda или Disk /dev/sdb: sudo fdisk -l | grep '^Диск /dev/sd[ab]' #Вызов grep из find find /usr/share/doc -type f -exec grep -i '3d modeling' "{}" \; | cut -c -100 #невозможно определить, из какого файла взяты строки #Эту проблему можно решить, добавив -H в grep find /usr/share/doc -type f -exec grep -i -H '3d modeling' "{}" \; | cut -c -100 #к строкам с совпадениями можно добавить начальные и конечные строки: #Опция -1 указывает grep на необходимость включать одну строку до и одну строку после строки с совпадением. # Тот же результат можно получить с помощью -C 1 или --context=1, при этом можно указать другое количество контекстных строк. find /usr/share/doc -type f -exec grep -i -H -1 '3d modeling' "{}" \; | cut -c -100
    fgrep and egrep

    У grep есть две дополнительные программы: egrep и fgrep. Программа egrep эквивалентна команде grep -E, которая включает в себя дополнительные функции, помимо базовых регулярных выражений. Например, с помощью egrep можно использовать расширенные возможности регулярных выражений, такие как ветвление.

    find /usr/share/doc -type f -exec egrep -i -H -1 '3d (моделирование|печать)' "{}" \; | cut -c -100

    В этом примере выражение будет соответствовать 3D modeling или 3D printing без учета регистра. Чтобы отобразить только те части текстового потока, которые соответствуют выражению egrep, используйте опцию -o


    Программа fgrep эквивалентна grep -F, то есть не анализирует регулярные выражения. Она полезна при простом поиске, когда нужно найти точное совпадение. Поэтому специальные символы, такие как знак доллара и точка, будут восприниматься буквально, а не в соответствии с их значением в регулярном выражении.

    sed

    Цель программы sed — неинтерактивное изменение текстовых данных
    Sed, как следует из названия, хорошо подходит для обработки текста, передаваемого по конвейеру. Его базовый синтаксис выглядит так: sed -f SCRIPT при условии, что инструкции по редактированию хранятся в файле SCRIPT
    Или sed -e COMMANDS для выполнения COMMANDS непосредственно из командной строки
    Если ни -f ни -e не указаны, sed использует в качестве файла сценария первый параметр без опции.
    В качестве входных данных также можно использовать файл, просто указав его путь в качестве аргумента для sed
    sed Команды состоят из одного символа, которому может предшествовать адрес или за которым может следовать один или несколько параметров, и применяются к каждой строке по очереди.
    Адреса могут представлять собой номер строки, регулярное выражение или диапазон строк.
    Например, первую строку текстового потока можно удалить с помощью 1d, где 1 указывает строку, к которой будет применена команда удаления d

    #возвращает простые множители чисел от 1 до 12: factor `seq 12` 1: 2: 2 3: 3 4: 2 2 5: 5 6: 2 3 ... #Удалить первую строку с помощью sed factor `seq 12` | sed 1d #Диапазон строк можно указать через запятую: factor `seq 12` | sed 1,7d

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

    #две инструкции по удалению: сначала в строках с 1-й по 7-ю, а затем в строке 11 factor `seq 12` | sed "1,7d;11d" #Регулярное выражение :.*2.* соответствует любому вхождению числа 2 в любом месте после двоеточия #что приводит к удалению строк, содержащих числа с коэффициентом 2 factor `seq 12` | sed "1d;/:.*2.*/d" 3: 3 5: 5 7: 7 9: 3 3 11: 11

    При использовании sed все, что находится между фигурными скобками (/), считается регулярным выражением, и по умолчанию поддерживаются все базовые регулярные выражения.
    Например, sed -e "/^#/d" /etc/services показывает содержимое файла /etc/services без строк, начинающихся с # (строк с комментариями).


    Команда удаления d — лишь одна из множества команд редактирования, предоставляемых sed. Вместо удаления строки sed может заменить ее заданным текстом:

    factor `seq 12` | sed "1d;/:.*2.*/c REMOVED" REMOVED 3: 3 REMOVED 5: 5 REMOVED 7: 7 REMOVED 9: 3 3 REMOVED 11: 11 REMOVED

    Инструкция r FILE делает то же самое, но копирует содержимое файла, указанного в FILE. Инструкция w выполняет действие, противоположное r, то есть строка добавляется в указанный файл.


    Наиболее часто используемая инструкция sed — s/FIND/REPLACE/, которая заменяет совпадение с регулярным выражением FIND текстом, указанным в REPLACE. Например, инструкция s/hda/sda/ заменяет подстроку, соответствующую регулярному выражению hda, на sda. Заменяется только первое совпадение, найденное в строке, если только после инструкции не указан флаг g, как в s/hda/sda/g.

    Источники
    Последнее изменение: 27.05.2026 16:51


    Связанные темы

    Команда exec linux

    Использование команды tee в Linux

    Язык shell в Linux

    Библиотеки Linux

    Использование md5sum

    Использование wget и curl в Linux

    Автоматическая загрузка классов

    Команда chattr и lsattr в Linux

    Использование awk Linux Alpine

    Использование sed в Linux

    Применение getopt в Linux

    Переменные окружения в Linux

    Командная оболочка Shell

    Классы символов в Linux

    Использование tar в Linux

    Подстановка имен файлов

    Проверка на необходимость перезапуска после обновления пакетов

    Стандартные потоки и перенаправление ввода/вывода в Linux

    Функции в языке Shell

    Использование grep в Linux

    Архивирование и сжатие файлов в Linux

    Использование find Linux

    Полезные команды и скрипты Linux

    Переменные в Linux

    Условная конструкция if в Linux

    Использование grep в Linux

    Использование xargs в Linux

    Фигурные скобки в bash

    Циклы в языке shell

    Использование оператора select в языке shell

    Внутренние и внешние команды linux

    Использование конструкции case в Linux

    Подстановка команд в Linux

    Мониторинг системы Linix с помощью getconf

    Использование ANCI последовательностей в Linux

    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ