Потоковый редактор sed

12.02.2018

Теги: LinuxRegExpКомандаРедакторШаблон

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

Следующий пример демонстрирует типичное использование sed:

sed 's/шаблон/замена/g' inputFile > outputFile

Редактор ищет в файле inputFile строки, содержащие шаблон и заменяет в них найденные совпадения на замена. Вывод перенаправляется в файл outputFile. Буква «s» — это сокращение слова «substitute», то есть — перед нами команда замены. По умолчанию, заменяется только первое вхождение шаблона в каждой строке. Флаг g предписывает заменить все вхождения.

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

  • Задать ограничение на номера обрабатываемых строк.
  • Указать фильтр, соответствующие которому строки нужно обработать.

Указание номера одной строки, которую нужно обработать:

sed '2s/шаблон/замена/g' inputFile

Указание диапазона строк, которые нужно обработать:

sed '2,4s/шаблон/замена/g' inputFile

Обработать только строки, соответствующие фильтру:

sed '/фильтр/s/шаблон/замена/g' inputFile

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

Редактор sed умеет не только заменять одну последовательность символов в строках на другую. Используя команду d (от delete), можно удалять строки из текстового потока. Например, удалим третью строку:
sed '3d' inputFile

Удалить строки, начиная с заданной — и до конца файла:

sed '3,$d' inputFile

Строки можно удалять и по шаблону:

sed '/шаблон/d' inputFile

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

sed '/первый/,/третий/d' inputFile

Вставка строк

С помощью sed можно вставлять данные в текстовый поток, используя команды i (от insert) и a (от append):

  • команда i добавляет новую строку перед заданной
  • команда a добавляет новую строку после заданной

Вызовем команды i и a, указав номер строки, перед/после которой надо вставить новую строку:

sed '3i\Это новая строка' inputFile
sed '5a\Это новая строка' inputFile

Замена строк

Команда c (от change) позволяет изменить содержимое целой строки текста в потоке данных. При её вызове нужно указать номер строки, вместо которой в поток надо добавить новые данные:

sed '3c\Это измененная строка' inputFile

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

sed '/шаблон/c Новая строка вместо старых' inputFile

Замена символов

Команда y работает с отдельными символами, заменяя их в соответствии с переданными ей при вызове данными:

sed 'y/1234/5678/' inputFile

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

Редактор sed поддерживает два типа регулярных выражений: базовый (BRE — basic regular expressions) и расширенный (ERE — extended regular expressions). По умолчанию sed использует базовый тип регулярных выражений.

В BRE распознаются следующие метасимволы:

^ $ . [ ] *

Все другие символы расцениваются как литералы. В ERE добавлены следующие метасимволы (и связанные с ними функции):

( ) { } ? + |

Тем не менее, символы «(», «)», «{» и «}» в BRE обрабатываются как метасимволы, если они экранированы обратным слешом; в то время как в ERE постановка перед любыми метасимволами обратного слеша приводит к тому, что они трактуются как литералы.

Опция -r редактора sed позволяет использовать расширенные регулярные выражения.

Опции редактора sed

Опция -n подавляет вывод. Чтобы получить вывод нужно специальное указание, например, команда p (от print).

Опция -e позволяет выполнить несколько команд, например:

sed -e 's/шаблон1/замена1/' -e 's/шаблон2/замена2/' inputFile

Опция -f позволяет выполнить большое количество команд, записанных в файл:

sed -f commandFile inputFile
# этот скрипт изменит все строчные гласные буквы на заглавные
s/a/A/g
s/e/E/g
s/i/I/g
s/o/O/g
s/u/U/g

Несколько примеров использования

Замена без использования модификатора g:

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

А теперь с модификатором глобальной замены:

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

Заключить все слова в скобки (& или \0 означает найденное совпадение с шаблоном):

$ echo 'глупый пингвин робко прячет' | sed 's/[^ ]*/(&)/g'
(глупый) (пингвин) (робко) (прячет)

Поменять слова местами:

$ echo 'глупый пингвин' | sed 's/\([а-я]*\) \([а-я]*\)/\2 \1/'
пингвин глупый
Обратите внимание — чтобы захватить части совпадений в карманы, используются круглые скобки с экранированием \(…\) — вот так странно работают регулярные выражения BRE.

Заменяем второе слово в строке (число после последнего разделителя указывает, какое по счету совпадение подлежит замене):

$ echo очень глупый пингвин | sed 's/[а-я]*/хороший/2'
очень хороший пингвин

Заменяем второе и все следующие слова:

$ echo очень глупый пингвин | sed 's/[а-я]*/хороший/2g'
очень хороший хороший

Удалить все слова, кроме первого:

$ echo 'очень глупый пингвин' | sed 's/[^ ]*//2g'
очень

Показать строки со 2 по 4:

$ cat unix.txt
The Unix operating system was pioneered by Ken
Thompson and Dennis Ritchie at Bell Laboratories
in the late 1960s. One of the primary goals in
the design of the Unix system was to create an
environment that promoted efficient program
development.
$ sed -n '2,4p' unix.txt
Thompson and Dennis Ritchie at Bell Laboratories
in the late 1960s. One of the primary goals in
the design of the Unix system was to create an

Удалить строки со 2 по 4:

$ sed '2,4d' unix.txt
The UNIX operating system was pioneered by Ken
environment that promoted efficient program
development.

Удалить все строки, содержащие текст «Unix»:

$ sed '/Unix/d' unix.txt
Thompson and Dennis Ritchie at Bell Laboratories
in the late 1960s. One of the primary goals in
environment that promoted efficient program
development.

Удалить последние три символа из каждой строки:

$ sed 's/...$//' unix.txt
The Unix operating system was pioneered by 
Thompson and Dennis Ritchie at Bell Laborator
in the late 1960s. One of the primary goals
the design of the Unix system was to create
environment that promoted efficient prog
developme

Добавить три * в начало каждой строки:

$ sed 's/^/***/' unix.txt
***The Unix operating system was pioneered by Ken
***Thompson and Dennis Ritchie at Bell Laboratories
***in the late 1960s. One of the primary goals in
***the design of the Unix system was to create an
***environment that promoted efficient program
***development.

Удалить строки, содержащие цифры:

$ sed '/[0-9]/d' unix.txt
The Unix operating system was pioneered by Ken
Thompson and Dennis Ritchie at Bell Laboratories
the design of the Unix system was to create an
environment that promoted efficient program
development.

Заменить первое вхождение «Unix» на «UNIX» во всех строках, содержащих «design»

$ sed '/design/s/Unix/UNIX/' unix.txt
The Unix operating system was pioneered by Ken
Thompson and Dennis Ritchie at Bell Laboratories
in the late 1960s. One of the primary goals in
the design of the UNIX system was to create an
environment that promoted efficient program
development.

Поиск: Linux • RegExp • Команда • Редактор • Шаблон

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.