Утилита Sed Linux: назначение и примеры использования

Сергій Бондаренко

Название Sed произошло от английского сокращения — Stream EDitor, потоковый текстовый редактор для Unix-среды. Sed не похож на привычный инструмент для работы с текстом, поскольку не является интерактивным редактором в привычном понимании. По своей «‎странности» он чем-то похож на знаменитый Vim. Принцип работы Sed заключается в непрерывной обработке входящего потока данных, например, в составе программного канала. Напомним, что программный канал или pipe — способ передачи вывода одной команды на вход другой. 

Утилита Sed работает с текстовыми файлами. Принцип работы с ним заключается в том, что вы указываете параметры редактирования текста, а программа сама автоматически производит все необходимые изменения. Благодаря такому конвейерному подходу, редактор может справляться с довольно большими массивами текстовых данных. Программа может спасти ситуацию, когда необходимо внести изменения в большие файлы, с которыми не справляются (или неэффективны) обычные средства. Команды Sed составляют определенный синтаксис, который влияет на правила обработки текстовой информации. 

Содержание

Внутренние команды Sed Linux
Примеры использования синтаксиса
Модификаторы потокового редактора
Заключение

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

У редактора Sed очень много внутренних команд. Самая главная из них, которая используется чаще других, — это команда замены текстового фрагмента. Чтобы поменять один текстовый фрагмент на другой, используем конструкцию:

sed s/ИСХОДНЫЙ_ТЕКСТ/ЗАМЕНЯЕМЫЙ_ТЕКСТ/

На практике это выглядит так:

 $ highload today | sed s/today/yesterday/ (Enter)
 highload yesterday

При наличии метасимволов в тексте выражение s/ИСХОДНЫЙ_ТЕКСТ/ЗАМЕНЯЕМЫЙ_ТЕКСТ/ необходимо было бы заключать в кавычки.

Иногда вместо прямого слеша используется обратный (в другую сторону). Это может быть удобно, если необходимо менять пути к каталогам (path), которые также разделяются прямым слешем. Например, когда имеем дело с каталогами /usr/local/bin, код выглядит некрасиво, так сказать, с «‎частоколом»

sed 's/\/usr\/local\/bin/\/common\/bin/'

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

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

Перечислим стандартные обозначения Regex:

  • * (звездочка) после любого символа или выражения означает произвольное количество повторений текста. Оно может быть и нулевым.
  • \+ Определяет число повторов текстового фрагмента не менее одного раза
  • \? Эта команда исключает возможность повторений за исключением одного
  • \{i\} Обозначенное число повторенийi
  • \{i,j\} вариант указания диапазона повторенийот i до j включительно
  • \{i,\} Количество повторенийне менее i
  • \{,j\} Количество повторенийне более j
  • \(RE\) Команда дает возможность оперировать с регулярным выражением как с единым целым. Например, \(а-я\)* определяет поиск любого количества (в том числе и нулевого) строчных букв в любом порядке.
  • . Произвольный символ
  • ^ Данный символ ставится в начале текстового фрагмента, который должен стоять в начале строки. Например, ^#highload_today вызовет поиск строк, начинающихся #highload_today.
  • $ Символ, определяющий конец строки текстового фрагмента
  • [Коллекция] Команда поиска всех символов массива. Например, [revolty] позволит найти буквы r, e, v, o, l , t, y.
  • [^Коллекция] Данная команда исключает из поиска символы из данного массива. Так, шаблон [^bcdfghjklmnpqrstvwxyz] будет определять поиск любой гласной. Вместо перечисления элементов коллекции можно указывать диапазон.
  • Интервал [а-я] означает любую строчную букву. Когда возникает необходимость использования квадратной скобки, этот символ указывается первым. Дефис нужно указывать или первым, или последним.
  • RE1\|RE2 Означает первое или второе регулярное выражение
  • RE1RE2 Команда объединения двух регулярных выражений
  • \n Показывает символ новой строки
  • \$; \*; \.; \[; \\; \^ Означают соответственно: $; *; .; [; \; ^

Примеры использования данного синтаксиса:

  • zxcvbn Означает zxcvbn
  • c*d Означает количество символов с более нуля (включительно) и одну букву d. Например, ccccccd; cd; или d.
  • z\?x Означает x или zx
  • c\+d\+ Означает одну или больше букв c и одну или больше букв d. Например: cd; ccccd; cddddd; или ccccccddddddd.
  • .* Выражение, которое определяет весь текст в строке, на всех строках, включая пустые.
  • .\+ Маска, задающая все символы на строках с количеством не менее одного символа. Это выражение игнорирует пустые строки.
  • ^after.*(.*) Маска для поиска строк, которые начинаются со слова after, а также включают открывающую и закрывающие скобки, причем перед и после открывающей скобки может располагаться произвольное количество символов (в том числе, равное нулю).
  • ^# Поиск строк, которые начинаются с символа «шарп» (удобно для поиска и редактирования комментариев в коде)
  • \\$ Строки, в конце которых стоит обратный слэш (\).
  • [a-zA-Z_] Любые буквы или цифры
  • [^ ]\+ (В скобке, установлен также пробел и табуляция)команда описывает один и более символов, кроме пробела и табуляции. Как правило, такое регулярное выражение соответствует словам.

Знак & означает любой текстовый фрагмент, обнаруженный в документе: 

$ echo 20381 | sed 's/[0-9]*/(&)/'
 (20381)

Без знака «*» текстовый редактор применил бы регулярное выражение только к первому знаку:

$ echo 20381 | sed 's/[0-9]/(&)/'
(2)0381

Рассмотрим практический пример, где необходимо отредактировать алгебраическое выражение, поставив скобки: 

 x+5467-176=y
$ sed 's/[0-9]*-[0-9]*/(&)/' mathexpression.txt
 x+(5467-176)=y

Пример удвоения исходного фрагмента текста с помощью амперсанда 

$ echo 701 | sed "s/[0-9]*/& &/"
701 701

Обратите внимание на то, что выражение [0-9]* ищет совпадения только в первом символе строки. Поэтому, если переставить фрагменты местами, то повторение наблюдаться не будет.

$ echo "xyz 701" | sed "s/[0-9]*/& &/"
xyz 701

Чтобы они удваивались, необходимо отредактировать маску замены:

$ echo "xyz qwer 701" | sed "s/[0-9][0-9]*/& &/"
xyz qwer 701 701

Перестановка слов местами

Ниже показан пример синтаксиса для редактора Sed, при котором слова в текстовом фрагменте меняются местами. 

$ echo вход выход |sed 's/\([а-я]*\) \([а-я]*\)/\2 \1/'
выход вход

В этом выражении мы запоминаем две подстроки, а затем выполняем их ротацию.

Удаление повторов

В данном случае \2 соответствует второму слову, а \1 — первому. Маску \1 можно использовать не только в шаблоне для замены, но и в образце для удаления повторяющихся слов. 

Например:

 $ echo longpool longpool  | sed 's/\([а-я]*\) \1/\1/'
longpool  

Модификаторы

Язык команд утилиты Sed реагирует модификаторы, которые конфигурируют действие программы если в строке имеется более одного совпадения. Например, глобальный модификатор g, определяет область поиска, не ограничивая его первым словом на строке. Так, если в документе есть текст и мы его обрабатываем без глобального модификатора g, имеем:

$ echo день этот, был самый обычный день | sed 's/день/денек/'
денек этот, был самый обычный день

Теперь запишем с модификатором и получим: 

$ echo кот этот, был самый обычный кот | sed 's/день/денек/g'
денек этот, был самый обычный денек

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

$ echo температура перманентно растет | sed 's/[а-я]*/падает/3'температура перманентно падает

Возможна также комбинация глобального и числового модификаторов

$ echo какая странная функция | sed 's/[а-я]*/(неопределенность)/2g'какая (неопределенность) (неопределенность)

Для удаления определенных слов в поле замены мы ничего не ставим или ставим пробел:

$ echo температура перманентно растет | sed 's/[^
]*//2g'температура

Модификатор /w дает возможность записывать результат редактирования сразу в определенный файл: 

$ sed 's/Исходный_фрагмент/Регулярное_выражение/w имя_файла

Команда /p в редакторе делает вывод на экран результата редактирования. Поскольку она применяется сама к себе, то удваивает число строк 

$ echo спасибо, что живой | sed 'p'
спасибо, что живой
спасибо, что живой

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

$ sed -n '/^#/ p' /boot/grub/menu.lst
# GRUB configuration file '/boot/grub/menu.lst'.
# generated by 'grubconfig'.  Птн 13 Сент 2021 02:31:11
#
# Start GRUB global section
# End GRUB global section
# Linux bootable partition config begins
# Linux bootable partition config ends
# Linux bootable partition config begins
# Linux bootable partition config ends

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

Заключение

Утилита Sed — один из тех инструментов, которыми приходится пользоваться не каждый день, однако, не имеющий альтернатив. Она справляется с большими объемами данных и при грамотном использовании регулярных выражений может творить с текстом чудеса, автоматизируя рутинную работу пользователя. Более подробное описание синтаксиса языка Sed можно найти в его официальной документации или в соответствующем «man».

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023