Назад в блог

Обзор потокового редактора Sed для работы с текстом в Linux

Обзор потокового редактора Sed для работы с текстом в Linux

Команда sed — это сокращение от stream editor (потоковый редактор). Это очень популярный инструмент в системах Linux/UNIX. Sed сам по себе не является текстовым редактором. Однако он может выполнять различные модификации для управления заданным текстом. Входной текст передается в виде потока. Sed затем выполняет предписанные действия над потоком. Это руководство содержит обзор команды sed и того, как с ней работать для успешного манипулирования текстом в Linux.

Sed в Linux

Входной поток sed может поступать либо из текстового файла, либо из STDIN (стандартного ввода). Мы можем работать с выводом другой команды или напрямую с текстовым файлом. Инструмент sed предустановлен во всех дистрибутивах Linux.

Обзор использования Sed

Команда sed имеет следующую структуру:

Для демонстрации мы взяли текстовую версию лицензии GPL версии 3:

Manipulate Text with Sed 7

Следующая команда sed выведет содержимое текстового файла:

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

Sed также принимает вывод другой команды в качестве входного потока. В следующем примере передайте содержимое текстового файла GPL v3 по конвейеру в sed для выполнения пустой операции:

Как выводить строки

Без указания каких-либо опций sed выведет все содержимое файла напрямую. Вместо этого мы можем явно отправить команду печати для вывода результатов непосредственно в стандартный вывод (STDOUT).

Для вывода используйте символ p:

Manipulate Text with Sed 6

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

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

Классы символов в регулярных выражениях

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

    • [a-z]: Символ в нижнем регистре
    • [A-Z]: Символ в верхнем регистре
    • [0-9]: Цифры
    • [a-zA-z]: Буквы
    • [a-zA-z0-9]: Любой буквенно-цифровой символ

Эти классы символов также имеют различные обозначения:

    • [:lower:]: Символ в нижнем регистре
    • [:upper:]: Символ в верхнем регистре
    • [:digit:]: Цифры
    • [:alpha:]: Буквы
    • [:alphanum:]: Буквенно-цифровой символ

Например, следующая команда выведет все строки, содержащие хотя бы одну цифру:

Manipulate Text with Sed 3

Диапазоны адресов

Мы можем указать конкретную часть текстового потока для работы. Это может быть статический адрес строки или диапазон строк. В первом примере мы выведем строку 5 из текстового файла GPL v3:

$ sed -n

Вместо одной строки мы также можем указать диапазон строк для работы. Здесь мы указали диапазон адресов от строки 5 до строки 9 (всего 5 строк), с которыми sed будет работать:

gpl-3.0.txt

Существуют также различные способы указания адреса строки. Вместо того чтобы определять номера строк самостоятельно, мы можем перестроить предыдущий пример так, чтобы sed начинал со строки 5 и обрабатывал следующие 5 строк:

5,+5p

Еще один способ указания строк — использование интервалов. В следующем примере sed начнет со строки 1 и будет обрабатывать каждую вторую строку:

Удаление текста

До сих пор мы работали над выводом целевых строк текста. Вместо вывода мы можем удалить эти строки из вывода. В следующем примере мы удалим несколько строк с начала. Здесь нам не нужно использовать опцию -n, потому что мы хотим, чтобы sed выводил всё остальное, что не удалено. Для удаления строк мы будем использовать опцию d:

Manipulate Text with Sed 2

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

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

Поскольку редактирование на месте опасно, sed поставляется с функцией резервного копирования. При редактировании на месте используйте -i.bak вместо -i, чтобы сделать резервную копию перед редактированием. Sed создаст файл резервной копии с расширением .bak:

Замена текста

На сегодняшний день это одно из самых распространенных применений sed. Он ищет текстовый шаблон и заменяет его на заданный текст. Здесь текстовый шаблон описывается регулярными выражениями (сокращенно regex). Чтобы узнать больше об использовании регулярных выражений, обратитесь к этому руководству, в котором описывается, как использовать Grep с регулярными выражениями для поиска текстовых шаблонов в файлах.

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

Здесь s — это команда замены. Косые черты являются разделителями для шаблона и замены. Давайте применим это на практике:

Manipulate Text with Sed 5

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

Здесь мы ищем com/index, чтобы заменить на net/home. Обратите внимание на расположение символов подчеркивания, так как они очень важны. Например, если вы пропустите последнее подчеркивание, sed выдаст ошибку:

Нам нужен тестовый файл для практики замены. Здесь у меня есть обрезанная версия текстового файла GPL v3:

Давайте выполним несколько базовых замен текста:

Посмотрите на следующий пример. Мы хотим заменить все вхождения the на THE :

$ echo

Заметили что-нибудь? Sed не изменил все вхождения the. На самом деле, изменилось только первое вхождение. Что происходит? Это поведение по умолчанию для опции s. Она находит только первое вхождение в данной строке и переходит к следующей. Чтобы убедиться, что sed проверяет всю строку на наличие искомого шаблона, нам нужно использовать необязательный флаг g. Давайте исправим команду:

Теперь все работает как надо. Еще один интересный способ использования команды — указание количества вхождений для изменения. В предыдущем примере было 3 вхождения the, верно? Как насчет того, чтобы указать изменение только 3-го вхождения? Изменение произойдет в необязательном флаге:

Если вы работаете с большим текстовым файлом, то может быть полезно, если sed выводил только те строки, в которых произошли замены. Чтобы добиться этого, нам нужно добавить еще один дополнительный флаг p:

Manipulate Text with Sed 4

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

По умолчанию все операции sed чувствительны к регистру. Следующая команда продемонстрирует поведение по умолчанию:

$ echo "HELLO WORLD"

Из-за несовпадения регистра изменений нет. В такой ситуации мы можем указать sed отключить чувствительность к регистру. Для этого добавьте необязательный флаг i:

Как заменять текст и ссылаться на него

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

Здесь символ каретки (^) обозначает начало строки. Оператор соответствия любому символу обозначается точкой (.). Звездочка (*) является выражением подстановки, соответствующим тексту от начала строки до GNU.

Еще один интересный трюк — использование символа &. Мы можем использовать его, чтобы выделить области, в которых sedнаходит искомый шаблон:

Manipulate Text with Sed

Заключение

В этом руководстве мы изучили основы команды sed . Мы узнали, как выводить определенные строки, искать текст, удалять и заменять текст, перезаписывать текст и использовать регулярные выражения. Правильно составленная команда sed может кардинально изменить текстовый документ. Теперь вы можете успешно манипулировать текстом в Linux с помощью sed.

Приятной работы!

author

Hark Labs

Автор · CloudSigma

Preslav Dobrev — креативный дизайнер в CloudSigma, сосредоточенный на формировании последовательного корпоративного образа с помощью традиционных и инновационных маркетинговых каналов. Он умело сочетает художественное видение со стратегическим маркетингом, создавая убедительные истории бренда.

Комментарии

Комментариев пока нет. Будьте первым.