SED — неинтерактивный текстовый редактор, предназначенный для пакетного редактирования файлов. Полезен для:

  • Редактирования очень больших файлов;
  • Редактирования файлов любой величины, если последовательность команд редактирования является слишком длинной и сложной и, следовательно, неудобной для выполнения интерактивного редактирования.
  • Выполнения множества раз одной и той же функции редактирования.

SED копирует строку из input (стандартный или указываемый набор файлов) в PATTERN SPACE (некоторая область), и к этой строке применяет все команды, адреса которых попадают в PATTERN SPACE . Затем PATTERN SPACE копируется в output . (Фактически в PATTERN SPACE находится одна строка, за исключением команды N , см. Функции SED )

Синтаксис SED

Формат:

SED [-n] [-e script] [-f sfile] [files]

script — набор команд редактирования SED , который может содержать до 200 команд или до 10000 байт.

sfile — файл со скриптом SED .

files — файлы, предназначенные для SED-редактирования.

-n — указывает, что в output выводятся не все строки, но только те, к которым применялась команда p. (См. 4.Функции SED . и 5.Функция контекстной замены.)

Флаг -e может быть опущен, если он присутствует один.

script — команда SED :

[address[,address]] function [arguments]

address — адрес

function — функция

arguments — аргументы

Основные операции sed

[lines]/p print
Печать [указанного диапазона строк]

[lines]/d delete
Удалить [указанный диапазон строк]

s/pattern1/pattern2/ substitute
Заменить первое встреченное соответствие шаблону pattern1, в строке, на pattern2

[lines]/s/pattern1/pattern2/ substitute
Заменить первое встреченное соответствие шаблону pattern1, на pattern2, в указанном диапазоне строк

[lines]/y/pattern1/pattern2/ transform
заменить любые символы из шаблона pattern1 на соответствующие символы из pattern2, в указанном диапазоне строк (эквивалент команды tr)

g

Global  — операция выполняется над всеми найдеными соответствиями внутри каждой из заданных строк

lines— диапазон строк, для осуществления отбора строк для редактирования, в адресах команд SED допускается использование регулярных выражений, заключенных в «/ /» и определяемых следующим образом:

  • Регулярное выражение указывается в разделителях: «/ /» ;
    любой символ (кроме специальных: \[.^*$ ) является регулярным выражением себя;
  • ^ в начале регулярного выражения указывает на пустой символ в начале регулярного выражения. (Т.е. на начало строки)
  • $ в конце регулярного выражения указывает на пустой символ в конце регулярного выражения. (Т.е. на конец строки);
  • \n — вставленный newline (новая строка);
  • . — любой символ (кроме обыкновенного newline );
  • — стоящая за регулярным выражением означает любую последовательность вхождений этого выражения, начиная с 0;
  • [ ] — указывает на один из символов, приведенных внутри;
  • [^ ] — указывает на один из символов, кроме приведенных внутри;
  • \ — перед любым символом, кроме цифр и «(» , «)» , означает этот символ. ( Экранирование специальных символов).
  • \(x\) -, где x — регулярное выражение, указывает на x .
  • \d -, где d — цифра, указывает копию d -того выражения, которое заключалось в скобки «\(» и «\)» ;

конкатенация регулярных выражений является регулярным выражением.

Функции SED


(В скобках указывается максимальное число адресов)

(1) a \text — Добавить «text» после указанной строки (вывести), потом считать следующую.

(2) b label — Перейти на метку, устанавливаемую, с помощью функции «:» , если label пуст, то перейти в конец скрипта.

(2) c \text — Удалить pattern space и вывести «text» на output .

(2) d — Удалить pattern space .

(2) D — Удалить pattern space до вставленной newline .

(2) g — Заместить содержимое pattern space содержимым буфера hold space .

(2) G — Добавить к содержимому pattern space содержимое буфера hold space .

(2) h — Заместить содержимое буфера hold space на содержимое pattern space .

(2) H — Добавить к содержимому буфера hold space содержимое pattern space .

(1) i \text — Вывести текст на output перед указанной строкой.

(2) n — Вывести pattern space на output и считать следующую строку.

(2) N — Добавить следующую строку к pattern space , разделяя строки вставленным newline .

(2) p — Скопировать pattern space на output .

(2) P — Скопировать pattern space до первой вставленной newline на output .

(1) q — Переход на конец input . Вывести указанную строку, (если нет флага -n ) и завершить работу SED .

(2) r rfile — Читать содержимое rfile и вывести его на output прежде чтения следующей строки.

(2) s — Функция контекстной замены.

(2) t label — Перейти на метку, устанавливаемую с помощью функции «:» , если для этой строки была осуществлена замена с помощью функции «s» . Флаг осуществления замены восстанавливается при чтении следующей строки или при выполнении функции «s» .

(2) w wfile — Добавить pattern space к концу файла wfile . (Максимально можно использовать до 10 открытых файлов.)

(2) x — Поменять местами содержимое pattern space и буфера hold space .

(2) y /str1/str2/ — Заменить все вхождения символов из str1 на соответствующие из str2 . Длины строк должны быть равными.

(2) ! func — Применять функцию func (или группу функций в {} ) к стокам НЕ попадающим в указанные адреса.

(0) : label — Устанавливает метку для перехода по «b» и «t» командам.

(1) = — Выводит номер строки на output как строку.

(2) { — Выполняет функции до «}» , только когда выбрано pattern space . Группировка функций.

(0) — Пустая команда игнорируется.

  1. — Комментарий.

( «#n» в скрипте равносильно установке флага -n )

Функция контекстной замены
Формат:

(2)s/ / /

Функция s заменяет вхождение в pattern space на .

: Аналогично выше данному, но может быть заключено не в «/ /» а в любые другие символы (не » » (пробел) и не newline ).

: Любой набор символов. Используются специальные символы:

«& » — Заменяется на строку, указанную в регулярном выражении.

«\d» — , где d — цифра, указывает на d -тое выражение, заключенное в «\(«,»\)» в регулярном выражении.

:

g — Глобальная замена: заменить все вхождения в строке.

p — Печатать (выводить на output ) строки, в которых была осуществлена замена.

w wfile — Выводить в файл wfile строки, в которых была осуществлена замена.

SED tips

Пространство между строками:

  • Двойное пространство между строками:
    1. sed G
  • Двойное пространство между строками исключая пустые строки (на выходе содержатся не больше одной пустой строки между двумя строками с текстом):
    1. sed ‘/^$/d;G’
  • Тройное пространство между строками:
    1. sed ‘G;G’
  • Удалить каждую вторую строку:
    1. sed ‘n;d’
  • Вставить пустую строку перед каждой строкой соответствующей регулярному выражению «regex»:
    1. sed ‘/regex/{x;p;x;}’
  • Вставить пустую строку после каждой строки соответствующей регулярному выражению «regex»:
    1. sed ‘/regex/G’
  • Вставить пустую строку перед и после каждой строки соответствующей регулярному выражению «regex»:
    1. sed ‘/regex/{x;p;x;G;}’

Нумерация:

  • Нумерация каждой стоки в файле filename. Используя отступ (tab) (смотрите примечание по ‘\t’ в конце документа) вместо пустой строки:
    1. sed = filename | sed ‘N;s/\n/\t/’
  • Нумерация каждой строки в файле filename (номер слева, выравненый по правому краю):
    1. sed = filename | sed ‘N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /’
  • Нумерация каждой строки в файле filename, с выводом номера только для не пустых строк:
    1. sed ‘/./=’ filename | sed ‘/./N; s/\n/ /’
  • Подсчет строк (эмуляция «wc -l»):
    1. sed -n ‘$=’

Преобразование и замена текста:

  • В UNIX окружении: преобразование окончания строк из формата DOS (CR/LF) в формат Unix (LF):
    1. sed ‘s/.$//’ (подразумевается что все строки заканчиваются с CR/LF)
    2. sed ‘s/^M$//’ (в bash/tcsh, нажмите Ctrl-V затем Ctrl-M)
    3. sed ‘s/\x0D$//’ (работает в ssed, gsed 3.02.80 или выше)
  • В UNIX окружении: преобразование разрыва строк Unix (LF) в формат DOS:
  1. sed «s/$/`echo -e \\\r`/» (команда в ksh)
  2. sed ‘s/$'»/`echo \\\r`/» (команда под bash)
  3. sed «s/$/`echo \\\r`/» (команда под zsh)
  4. sed ‘s/$/\r/’ (команда под gsed 3.02.80 или выше)
  • В DOS окружении: преобразование разрыва строк Unix (LF) в формат DOS:
  1. Версия 1: sed «s/$//»
  2. Версия 2: sed -n p
  • В DOS окружении: преобразование разрыва строк DOS (CR/LF) в формат Unix. Can only be done with UnxUtils sed, version 4.0.7 or higher. The UnxUtils version can be identified by the custom «—text» switch which appears when you use the «—help» switch. Otherwise, changing DOS newlines to Unix newlines cannot be done with sed in a DOS environment. Use «tr» instead.:
  1. sed «s/\r//» infile >outfile (UnxUtils sed v4.0.7 или выше)
  2. tr -d \r outfile (GNU tr версии 1.22 или выше)
  • Удалить все пробелы и символы табуляции в начале каждой строки файла (смотрите примечание по табуляции в конце документа):
    1. sed ‘s/^[ \t]*//’
  • Удалить все пробелы и символы табуляции в конце каждой строки файла (смотрите примечание по табуляции в конце документа):
    1. sed ‘s/[ \t]*$//’
  • Удалить все пробелы и символы табуляции в начале и конце каждой строки файла (смотрите примечание по табуляции в конце документа):
    1. sed ‘s/^[ \t]*//;s/[ \t]*$//’
  • Вставить 5 пробелов в начале каждой строки (создать смещение страницы):
    1. sed ‘s/^/ /’
  • Расположить весь текст по правому краю столбца шириной в 79 символов:
    1. sed -e :a -e ‘s/^.\{1,78\}$/ &/;ta’ (устанавливает как 78 плюс 1 пробельный символ)
  • Центрировать весь текст посередине столбца шириной 79 символов. В версии 1, пробелы добовляются в начало и конец строки. В версии 2, пробелы добовляются только в начало строки:
    1. Версия 1: sed -e :a -e ‘s/^.\{1,77\}$/ & /;ta’
    2. Версия 2: sed -e :a -e ‘s/^.\{1,77\}$/ &/;ta’ -e ‘s/\( *\)\1/\1/’
  • Поиск и замеа «foo» на «bar» в каждой строке:
    1. sed ‘s/foo/bar/’ (замена только первого совпадения в строке)
    2. sed ‘s/foo/bar/4’ (замена первых 4рех совпадений в строке)
    3. sed ‘s/foo/bar/g’ (замена ВСЕХ совпадений в строке)
    4. sed ‘s/\(.*\)foo\(.*foo\)/\1bar\2/’ (замена предпоследнего совпадения)
    5. sed ‘s/\(.*\)foo/\1bar/’ (замена только последнего совпадения)* Замена «foo» на «bar» ТОЛЬКО для строк содержащих «baz»:
  1. sed ‘/baz/s/foo/bar/g’
  • Замена «foo» на «bar» ИСКЛЮЧАЯ строки содержащие «baz»:
    1. sed ‘/baz/!s/foo/bar/g’
  • Замена «scarlet» или «ruby», или «puce» на «red»:
    1. sed ‘s/scarlet/red/g;s/ruby/red/g;s/puce/red/g’ (большинство sed-ов)
    2. gsed ‘s/scarlet\|ruby\|puce/red/g’ (только GNU sed)
  • Перевернуть последовательность строк (эмуляция «tac») (ошибка/особеннось в HHsed v1.5 причина удалению пустой строки):
    1. Версия 1: sed ‘1!G;h;$!d’
    2. Версия 2: sed -n ‘1!G;h;$p’
  • Перевернуть каждую строку в файле задом наперед (эмуляция «rev»):
    1. sed ‘/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//’
  • Соеденить каждую пару строк бок о бок (подобно «paste»):
    1. sed ‘$!N;s/\n/ /’
  • Если линия заканчивается обратной косой чертой «\», то присоеденить следующую линию:
    1. sed -e :a -e ‘/\\$/N; s/\\\n//; ta’
  • Если линия начинается с знака «=», то присоеденить ее к предыдущей линии и заменить «=» пробелом:
    1. sed -e :a -e ‘$!N;s/\n=/ /;ta’ -e ‘P;D’
  • Добавить запятые к строке из чисел, изменяя «1234567» на «1,234,567»:
    1. gsed ‘:a;s/\B[0-9]\{3\}\>/,&/;ta’ (GNU sed)
    2. sed -e :a -e ‘s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta’ (другие sed-ы)
  • Добавить запятые к числу с десятичной частью и знаком минуса (GNU sed):
    1. gsed -r ‘:a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta’
  • Добавить пустую строку через каждые 5 строк (после строк 5, 10, 15, 20, и т.д.):
    1. gsed ‘0~5G’ (только GNU sed)
    2. sed ‘n;n;n;n;G;’ (другие sed-ы)Выборочная печать некоторых строк:
  • Печатать первые 10 линий файла (эмуляция «head»):
    1. sed 10q
  • Печатать первую строку файла (эмуляция «head -1»):
    1. sed q
  • Печатать последние 10 строк файла (эмуляция «tail»):
    1. sed -e :a -e ‘$q;N;11,$D;ba’
  • Печатать последние 2 строки файла (эмуляция «tail -2»):
    1. sed ‘$!N;$!D’
  • Печатать последнюю строку файла (эмуляция «tail -1»):
    1. Версия 1: sed ‘$!d’
    2. Версия 2: sed -n ‘$p’
  • Печатать предпоследнюю строку в файле:
    1. sed -e ‘$!{h;d;}’ -e x (для однострочного файла печатать пустую строку)
    2. sed -e ‘1{$q;}’ -e ‘$!{h;d;}’ -e x (для однострочного файла печатать эту строку)
    3. sed -e ‘1{$d;}’ -e ‘$!{h;d;}’ -e x (для однострочного файла ничего не печатать)
  • Печатать только те строки, которые совпадают с регулярным выражением (эмуляция «grep»):
    1. Версия 1: sed -n ‘/regexp/p’
    2. Версия 2: sed ‘/regexp/!d’
  • Печатать только те строки, которые НЕ совпадают с регулярным выражением (эмуляция «grep -v»):
    1. sed -n ‘/regexp/!p’ — Версия 1, corresponds to above
    2. sed ‘/regexp/d’ — Версия 2, simpler syntax
  • Печатать строку непосредственно перед регулярным выражением, но не печатать строку содержащую регулярное выражение:
    1. sed -n ‘/regexp/{g;1!p;};h’
  • Печатать строку непосредственно после регулярного выражения, но не печатать строку содержащую регулярное выражение:
    1. sed -n ‘/regexp/{n;p;}’
  • Печатать по одной строке перед и после регулярного выражения, с указанием номера строки совпадающей с регулярным выражением (симуляция «grep -A1 -B1»):
    1. sed -n -e ‘/regexp/{=;x;1!p;g;$!N;p;D;}’ -e h
  • Печать строк, совпадающих с регулярными выражениями AAA, BBB и CCC одновременно (в любой последовательности):
    1. sed ‘/AAA/!d; /BBB/!d; /CCC/!d’
  • Печать строк, совпадающих с регулярными выражениями AAA, BBB и CCC одновременно (в конкретной последовательности):
    1. sed ‘/AAA.*BBB.*CCC/!d’
  • Печать строк, совпадающих с любым регулярным выражением AAA или BBB, или CCC (эмуляция «egrep»):
    1. sed -e ‘/AAA/b’ -e ‘/BBB/b’ -e ‘/CCC/b’ -e d (большинство sed’ов)
    2. gsed ‘/AAA\|BBB\|CCC/!d’ (только GNU sed)
  • Печатать абзац если он содержит AAA (пустая строка разделяет абзацы) (в HHsed v1.5 необходимо вставить ‘G;’ после ‘x;’):
    1. sed -e ‘/./{H;$!d;}’ -e ‘x;/AAA/!d;’
  • Печатать абзац если он содержит AAA, BBB и CCC (в любой последовательности) (в HHsed v1.5 необходимо вставить ‘G;’ после ‘x;’):
    1. sed -e ‘/./{H;$!d;}’ -e ‘x;/AAA/!d;/BBB/!d;/CCC/!d’
  • Печатать абзац если он содержит AAA или BBB, или CCC (в HHsed v1.5 необходимо вставить ‘G;’ после ‘x;’):
    1. sed -e ‘/./{H;$!d;}’ -e ‘x;/AAA/b’ -e ‘/BBB/b’ -e ‘/CCC/b’ -e d
    2. gsed ‘/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d’ (только GNU sed)
  • Печатать строки длиной равной или большей 65 символов:
    1. sed -n ‘/^.\{65\}/p’
  • Печатать строки длиной меньше или равной 65 символов:
    1. sed -n ‘/^.\{65\}/!p’ — Версия 1, отвечает условию
    2. sed ‘/^.\{65\}/d’ — Версия 2, более простой синтаксис
  • Печатать часть файла начиная от совпадения с регулярным выражением и до конца файла:
    1. sed -n ‘/regexp/,$p’
  • Печатать часть файла основываясь на номерах строк (строки 8-12, включительно):
    1. Версия 1: sed -n ‘8,12p’
    2. Версия 2: sed ‘8,12!d’
  • Печатать строку под номером 52:
    1. sed -n ’52p’ — Версия 1
    2. sed ’52!d’ — Версия 2
    3. sed ’52q;d’ — Версия 3, эффективен на больших файлах
  • Начиная с 3ей строки печатать каждую седьмую строку в файле:
    1. gsed -n ‘3~7p’ (только GNU sed)
    2. sed -n ‘3,${p;n;n;n;n;n;n;}’ (другие sed-ы)
  • Печатать часть файла между двумя регулярными выражениями (включительно):
    1. sed -n ‘/Iowa/,/Montana/p’ (регистро зависимый)

Избирательное удаление определенных строк:

  • Печатать все линии ИСКЛЮЧАЯ часть между двумя регулярными выражениями:
    1. sed ‘/Iowa/,/Montana/d’
  • Удалить дубликаты последовательных строк в файле (эмуляция «uniq»). Первая строка в наборе дубликатах строк удерживается от удаления:
    1. sed ‘$!N; /^\(.*\)\n\1$/!P; D’
  • Удалить дубликаты непоследовательных строк в файле. Остерегайтесь переполнения буфера или используйте GNU sed: (Beware not to overflow the buffer size of the hold space)
    1. sed -n ‘G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P’
  • Печатать только дубликаты строк (эмуляция «uniq -d»).:
    1. sed ‘$!N; s/^\(.*\)\n\1$/\1/; t; D’
  • Удалить первые 10 строк в файле:
    1. sed ‘1,10d’
  • Удалить последнюю строку в файле:
    1. sed ‘$d’
  • Удалить 2 последние строки файла:
    1. sed ‘N;$!P;$!D;$d’
  • Удалить последние 10 строк файла:
    1. Версия 1: sed -e :a -e ‘$d;N;2,10ba’ -e ‘P;D’
    2. Версия 2: sed -n -e :a -e ‘1,10!{P;N;D;};N;ba’
  • Удалить каждую восьмую строку в файле:
    1. gsed ‘0~8d’ (только GNU sed)
    2. sed ‘n;n;n;n;n;n;n;d;’ (другие sed-ы)
  • Удалить строки совпадающие с регулярным выражением:
    1. sed ‘/pattern/d’
  • Удалить ВСЕ пустрые строки из файла (эмуляция «grep ‘.’ «):
    1. Версия 1: sed ‘/^$/d’
    2. Версия 2: sed ‘/./!d’
  • Удалить все последовательности пустых строк из файла исключая первую. Также удалить все пустые строки в начале и в конце файла (эмуляция «cat -s»):
    1. sed ‘/./,/^$/!d’ (Версия 1, допускается 0 пустых строк в начале и 1 в конце файла)
    2. sed ‘/^$/N;/\n$/D’ (Версия 2, допускается 1 пустая строка в начале и 0 в конце файла)
  • Оставить последовательность пустых строк не более двух одновременно:
    1. sed ‘/^$/N;/\n$/N;//D’
  • Удалить все пустые строки в начале файла:
    1. sed ‘/./,$!d’
  • Удалить все пустые строки в конце файла:
    1. sed -e :a -e ‘/^\n*$/{$d;N;ba’ -e ‘}’ (для всех sed-ов)
    2. sed -e :a -e ‘/^\n*$/N;/\n$/ba’ (для всех, кроме gsed 3.02.*)
  • Удалить последнюю непустую строку в каждом абзаце:
    1. sed -n ‘/^$/{p;h;};/./{x;/./p;}’

Специальные приложения:

  • Удалить конкретный символ (к примеру: символ возврата) из man страницы. Для использования команды ‘echo’ может потребоваться указать параметр -e (если вы используете Unix System V или оболочку bash):
    1. sed «s/.`echo \\\b`//g» (двойные кавычки необходимы в Unix окружении)
    2. sed ‘s/.^H//g’ (в bash/tcsh, нажмите Ctrl-V и затем Ctrl-H)
    3. sed ‘s/.\x08//g’ (hex выражение для sed 1.5, GNU sed, ssed)
  • Получить заголовок Usenet/e-mail сообщения:
    1. sed ‘/^$/q’ (удаляет все после первой пустой строки)
  • Получить тело Usenet/e-mail сообщений:
    1. sed ‘1,/^$/d’ (удаляет все до первой пустой строки)
  • Получить заголовок Subject (тема Usenet/e-mail сообщения), без удаления части «Subject: «:
    1. sed ‘/^Subject: */!d; s///;q’
  • Получить заголовок обратный адрес:
    1. sed ‘/^Reply-To:/q; /^From:/h; /./d;g;q’
  • Анализировать правильный исходящий адрес. # Pulls out the e-mail address by itself from the 1-line return address header (see preceding script):
    1. sed ‘s/ *(.*)//; s/>.*//; s/.*[: /’
  • Удалить скобку и пробел в начале каждой строки (unquote a message):
    1. sed ‘s/^> //’
  • Удалить большинство HTML тегов (включая теги состоящие из несколько строк):
    1. sed -e :a -e ‘s/]*>//g;/

Использованные источники:
ОИВС
gazette.linux.ru.net
снова gazette.linux.ru.net
source.nnov.ru