SED (от англ. Stream EDitor) — потоковый текстовый редактор (а также язык программирования), применяющий различные предопределённые текстовые преобразования к последовательному потоку текстовых данных. sed получает входной поток (обычно файл) построчно, редактирует каждую строку согласно правилам, определённым в sed-скрипте с использованием простого языка sed, и затем выводит результат в выходной поток. Так как одновременно в памяти находится только одна строка, sed может обработать произвольно большие текстовые файлы.

Опции утилиты:
-p вывести на экран
-d удалить
-i выполнять изменения непосредственно в файле
-n не выводить результат замены/поиска на экран (--quiet, --silent)
-e regex команда замены/удаления или выражение для поиска/фильтрации (может быть несколько)
-r использовать расширенный синтаксис. Спец символы активны по умолчанию (--regexp-extended)
-s consider files as separate rather than as a single continuous long stream (--separate)

Флаги строки-команды:
g глобальный поиск/замена, а не только первое совпадение
i,-l регистро-независимый поиск
p печать найденных подстрок
d удалить строки

Условные обозначения (расширение GNU):
\L переводит символы ЗАМЕНЫ в нижний регистр
\l переводит следующий символ ЗАМЕНЫ в нижний регистр
\U переводит символы ЗАМЕНЫ в верхний регистр
\u переводит следующий символ ЗАМЕНЫ в верхний регистр
\E отменяет перевод, начатый \L или \U
По очевидным причинам эти условные обозначения применяются по одиночке.

Регулярные выражения (Regular expressions, regexp, RE)

с Или любая другая буква. Большинство букв, цифр и прочих неспециальных символов считаются регулярными выражениями, представляющими сами себя.
* Астериск, следующий за каким-либо символом или регулярным выражением, означает любое число (в том числе и нулевое) повторов этого символа или регулярного выражения.
\+ Означает один или более повтор символа или регулярного выражения.
\? Означает ни одного или один повтор.
\{i\} Означает ровно i повторов.
\{i,j\} Число повторов находится в интервале от i до j включительно.
\{i,\} Число повторов больше или равно i.
\{,j\} Число повторов меньше или равно j.
\(RE\) Запомнить регулярное выражение или его часть с целью дальнейшего использования как единое целое. Например, \(а-я\)* будет искать любое сочетание любого количества (в том числе и нулевого) строчных букв.
. Означает любой символ, в том числе символ новой строки.
^ Означает нулевое выражение в начале строки. Другими словами, то, перед чем стоит этот знак, должно появляться в начале строки. Например, ^#include будет искать строки, начинающиеся с #include.
$ То же, что и предыдущее, только относится к концу строки.
[СПИСОК] Означает любой символ из СПИСКА. Например, [aeiou] будет искать любую английскую гласную букву.
[^СПИСОК] Означает любой символ, кроме тех, что в списке. Например, [^aeiou] будет искать любую согласную. Примечание: СПИСОК может быть интервалом, например [а-я], что будет означать любую строчную букву. Если нужно включить в СПИСОК ] (квадратную скобку) укажите ее в списке первой; если нужно включить в СПИСОК - (дефис), то укажите его в списке первым или последним.
RE1\|RE2 Означает РВ1 или РВ2.
RE1RE2 Означает объединение регулярных выражений РВ1 и РВ2.
\n Означает символ новой строки.
\$; \*; \.; \[; \\; \^ Означают соответственно: $; *; .; [; \; ^
Внимание: Остальные условные обозначения на основе обратного слэша (\), принятые в языке С, не поддерживаются программой sed.
\1 \2 \3 \4 \5 \6 \7 \8 \9 Означает соответствующую по счету часть регулярного выражения, запомненную при помощи знаков \( и \).

Несколько примеров:

abcdef Означает abcdef
a*b Означает ноль или любое количество букв а и одна буква b. Например, aaaaaab; ab; или b.
a\?b Означает b или ab
a\+b\+ Означает одну или больше букв а и одну или больше букв b. Например: ab; aaaab; abbbbb; или aaaaaabbbbbbb.
.* Означает все символы на строке, на всех строках, включая пустые.
.\+ Означает все символы на строке, но только на строках, содержащих хотя бы один символ. Пустые строки не соответствуют данному регулярному выражению.
^main.*(.*) Будет искать строки, начинающиеся со слова main, а также имеющие в своем составе открывающую и закрывающие скобки, причем перед и после открывающей скобки может находиться любое количество символов (а может и не находиться).
^# Будет искать строки, начинающиеся со знака # (например комментарии).
\\$ Будет искать строки, заканчивающиеся обратным слэшем (\).
[a-zA-Z_] Любые буквы или цифры
[^ ]\+ (В квадратной скобке, кроме символа ^, содержится еще пробел и табуляция) --Означает один или любое количество любых символов, кроме пробела и табуляции. Обычно имеется в виду слово.
^.*A.*$ Означает заглавную букву А точно в середине строки.
A.\{9\}$ Означает заглавную букву А, точно десятую по счету от конца строки.
^.\{,15\}A Означает заглавную букву А, точно шестнадцатую по счету от начала строки.



-Заменить текст:

# cat file | sed s/day/night/ 

не брал выражение s/ОБРАЗЕЦ/ЗАМЕНУ/ в кавычки, так как данный пример не нуждается в кавычках, но если бы в нем присутствовали метасимволы, то кавычки были бы обязательны. Чтобы не ломать себе каждый раз голову, и не ошибиться ненароком, всегда ставьте кавычки, лучше более "сильные" одинарные, это хорошая привычка.

-Уникальность программы sed в том, что она позволяет использовать любой разделитель, например знак подчеркивания:

# echo 123123| sed 's_1_5_g' 
или другие варианты:
# echo 123123| sed 's:1:5:g'
# echo 123123| sed 's/1/5/g'
# echo 123123| sed 's%1%5%g'
# echo 123123| sed 's$1$5$g'
# echo 123123| sed 's|1|5|g' 

-Записывать результаты обработки текста в указанный файл (w):

# sed 's/ОБРАЗЕЦ/ЗАМЕНА/w file.txt

-Указать команду шелла (не программы sed) в качестве ЗАМЕНЫ (e).

# echo night | sed 's/night/echo day/e' 
day

-Заменить слово несмотря на регистр (i,l):

# cat file | sed 's/night/day/i' 

Модификаторы можно комбинировать, когда это имеет смысл. При этом следует ставить модификатор w последним.

 


Опции программы sed
-Выполнить несколько команд подряд (-e):

# sed -e 's/a/A/' -e 's/b/B/' file.txt

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

# sed -f sedscript.txt file.txt
В файле sedscript.txt можно указать команды списком:
s/a/A/g
s/e/E/g
s/i/I/g
s/o/O/g

-Не выводить ничего на стандартный вывод(-n):

# cat file | sed -n 's/night/day/i' 

-Прекратить обработку после 11той строки (q):

# sed '11 q' file.txt

-Вывести номер строки со словом snow:

# sed -n  '/snow/=' gumilev.txt

Команда принимает только один адрес, не принимает интервалов. -Написать скрипт subst.sed, используя шебанг:

#!/bin/sed -f
s/x/y/g
и выполнять скрипт следующим образом:
# subst.sed inputFileName > outputFileName 

 

Примеры:

Замена:

-Заменить Nick или nick на John:

# sed 's/Nick\|nick/John/g' report.txt
или:
# sed 's/[Nn]ick/John/g' report.txt

-Заменяет foo на bar только в первом вхождении в строке.

# sed 's/foo/bar/' file.txt

-Заменяет foo на bar только в четвертом вхождении в строке:

# sed 's/foo/bar/4' file.txt

-Заменяет foo на bar для всех вхождений в строке.

# sed 's/foo/bar/g' file.txt

-Заменить foo на bar только если строка содержит baz.

# sed '/baz/s/foo/bar/g' file.txt

-Заменить V на (V) в 3ей строке:

# sed '3 s/V/(V)/' gumilev.txt

-Заменить V на (V) в диапазоне строк 2-3:

# sed '2,3 s/V/(V)/' gumilev.txt

-Заменить от второй до последней строки файла:

# sed '2,$ s/v/(v)/i' gumilev.txt

-В строке со словом “утра” заменить в на (в):

# sed '/morning/ s/v/(v)/i' gumilev.txt

-Замена строк между словами “morning” и “day”:

# sed '/morning/,/day/ s/v/(v)/i' gumilev.txt

-Замена строк от первой строки до “снега”:

# sed '1,/snow/ s/v/(v)/i' gumilev.txt

-Замена строк от “снега” и до конца файла:

# sed '/snow/,$ s/v/(v)/i' gumilev.txt

-Заменить значения в БД:

# sed -i -e 's%utf8_general_520_ci%utf8_general_ci%g' pavelwj3_dede.sql

-Заменить домены в файлах:

# find . -type f -name '*' -exec sed -i -r 's%beritaxi.com%cf89767.tmweb.ru%g' {} \; 

-Заменить пути в файлах:

# find . -type f -name '*' -exec sed -i -r 's%home/beri/cf99999.tmweb.ru%home/c/cf99999/public_html%g' {} \; 

-Замена путей Unix

# sed 's/\/some\/UNIX\/path/\/a\/new\/path/g' file.txt

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

# sed 's/\s\+/,/' cut.txt

-Заменяет ham на cheese в file.txt за исключением 5-й строки:

# sed '5!s/ham/cheese/' file.txt

-Заменить повторяющиеся пустые строки на одну пустую строку

# sed -e ':a;/^$/N;/\n$/{D;ba}' file.txt

-Если найден "boom", заменить aaa на bb:

# sed '/boom/s/aaa/bb/' file.txt

-Заменяет one на unos независимо от регистра, поэтому будет напечатано "unos TWO":

# echo ONE TWO | sed "s/one/unos/I" 

-Заменяет /usr/bin на /usr/bin/local в path.txt

# sed 's@/usr/bin@&/local@g' path.txt

-Заменяет на 9999 все значения в первой колонке CSV-файла

# sed 's/^[^,]*,/9999,/' file.csv

-Заменяет Johnson на White только в строках 1 - 20.

# sed '1,20 s/Johnson/White/g' file.txt

-Предыдущий пример наоборот (заменяет везде, кроме строк 1-20)

# sed '1,20 !s/Johnson/White/g' file.txt

-Заменяет только между "from" и "until". Если областей "from"-"until" несколько, заменяет в каждой из них.

# sed '/from/,/until/ { s/\<red\>/magenta/g; s/<blue\>/cyan/g; }' file.txt

-Заменяет только со слова "ENDNOTES:" и до EOF

# sed '/ENDNOTES:/,$ { s/Schaff/Herzog/g; s/Kraft/Ebbing/g; }' file.txt

Вставка:

-Вставить символ # в начало строки, содержащей текст:

# sed -i '/текст/s/^/#/' file.txt

-Вставить символ # в начало строки, содержащей текст, и начинающейся не с символа #:

# sed -i '/^[^#].*текст/s/^/#/' file.txt

-В начале строки, где есть слово require вставить кавычку('):

# sed /require/s/^/\'/ 

-В конце строки, где есть слово require добавить кавычку('):

# sed /require/s/$q/\'/ 

-Вставить 8 пробелов в начало каждой строки:

# sed 's/^/        /' file.txt > file_new.txt

-Вставляет пустую строку после каждой строки в file.txt:

# sed G file.txt 

-Вставляет две пустые строки после каждой строки в file.txt:

# sed 'G;G' file.txt 

-Вставляет пустую строку под каждой строкой, содержащей regex

# sed '/regex/G' file.txt

-Вставляет пустую строку над и под каждой строкой, содержащей regex

# sed '/regex/{x;p;x;G;}' file.txt

-Вставить слово GHJ в конец каждой строки:

# sed s/$/GHJ/g

-Вставить в начало файла '# vim: ft=ruby' и перенос строки.

# sed '1i # vim: ft=ruby\n' 

-Вставить после 14ой строки"echo "graph_category logger"".

# sed '14a\ echo \"graph_category logger\"' /etc/munin/plugins/command

-Добавить в конец файла "[mounts]" затем перенос на новую строка и "user root".

# sed -i '$ a \\n[mounts]\nuser root' /etc/munin/config

Вывод:

-Вывести все между строками Of course и attention you pay:

# sed -n '/Of course/,/attention you pay/p' myfile

-Вывесети 1000-ную строку

# sed -n '1000p;1000q' 

-Вывесети строки с 1 по 10:

# sed -n '1,10 p' file.txt

-Вывесети строки с 10 по 20-ую

# sed -n '10,20p;20q' 

-Выводит только строки 12-18 файла file.txt:

# sed -n 12,18p file.txt

-Выводит весь файл file.txt за исключением строк с 12 по 18:

# sed 12,18d file.txt

-Выводит 5 строк после строки содержащей regex

# sed -n '/regex/,+5p' file.txt

-Вывести каждую пятую строку, начиная со второй.

# sed -n '2~5p' file.txt

-Выводит только строки с тремя последовательными цифрами:

# sed -n '/[0-9]\{3\}/p' file.txt

-Выводит строку с первым соответствием RE (регулярного выражения)

# sed -n '/RE/{p;q;}' file.txt

-Выводит абзац только если он содержит regex

# sed '/./{H;$!d;};x;/regex/!d' file.txt

-Выводит абзацы только если они содержат RE1, RE2 и RE3. Порядок RE1, RE2 и RE3 не имеет значения.

# sed -e '/./{H;$!d;}' -e 'x;/RE1/!d;/RE2/!d;/RE3/!d' file.txt

-Выводит строку, находящуюся перед первым соответствием регулярному выражению, но не включающую само соответствие

# sed -n '/regexp/{g;1!p;};h' file.txt

-Выводит строку, находящуюся после первого соответствия регулярному выражению, но не включающую само соответствие

# sed -n '/regexp/{n;p;}' file.txt

-Выводит файл services без закомментированных строк

# sed -e '/^#/d' /etc/services | less

-Вывести только закомментированные строки:

# sed -n '/^#/ p' /boot/grub/menu.lst

-Ищет строки содержащие AAA, BBB и CCC в любом порядке

# sed '/AAA/!d; /BBB/!d; /CCC/!d' file.txt

-Ищет строки содержащие AAA, BBB и CCC в заданном порядке

# sed '/AAA.*BBB.*CCC/!d' file.txt

-Выводит строки длиной 65 символов и более

# sed -n '/^.\{65\}/p' file.txt

-Выводит строки длиной 65 символов и менее

# sed -n '/^.\{65\}/!p' file.txt

-Выводит нечетные строки в файле:

# awk 'NR%2==0' file
или:
# sed ' n; d' file

-Выводит четные строки в файле:

# sed '1d; n; d' file

Удаление:

-Удалить строку содержащую Network или network.

# sed -i '/[Nn]etwork/d' /file

-Убрать символы # в начале строки, содержащей текст:

# sed -i '/текст/s/^#\+//' file

-Удаляет последнюю строку:

# sed '$d' file.txt

-Удалить 14ую строку:

# sed -i '14d' /file

-Удаляет все строки, начиная с 17-й, до "disk". Если строк с "disk" несколько, удаляет до первой из них:

# sed '17,/disk/d' file.txt

-В общем случае удаляет последний символ в каждой строке:

# sed 's/.$//' file.txt

-Удаляет все пробелы/табы перед каждой строкой в file.txt:

# sed 's/^[ \t]*//' file.txt

-Удаляет все пробелы/табы в конце каждой строки в file.txt:

# sed 's/[ \t]*$//' file.txt

-Удаляет все пробелы/табы в начале и в конце каждой строки в file.txt:

# sed 's/^[ \t]*//;s/[ \t]*$//' file.txt

-Удалить все начальные пустые строки

# sed '/./,$!d' file.txt

-Удалить все замыкающие пустые строки

# sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' file.txt

-Удалить каждую третью строку, начиная с первой.

# sed '1~3d' file.txt

-Удалить все строки кроме второй (!):

# sed '2 !d' gumilev.txt

-Удалить закомментированные строки:

# sed '/^#/ d' /boot/grub/menu.lst

-Удалить все строки включительно до слова keyword:

# sed '1,/keyword/ d' < file

-Удалить все строки включительно начиная со слова FILTERS_OUT:

# sed '/FILTERS_OUT/,$ d' < file

-Удалить текст строки до слова zimbraMailSieveScript:

# sed 's/^zimbraMailSieveScript: //' 

-Удаляет строку с первым соответствием

# sed '0,/RE/{//d;}' file.txt

-Удаляет все символы, начиная с a и заканчивая g из файла file.txt:

# sed 's/[a-g]//g' file.txt

-Удаляет строки, соответствующие шаблону pattern

# sed '/pattern/d' file.txt

-Удаляет все пустые строки из файла

# sed '/./!d' file.txt

-Удаляет последнюю строку каждого абзаца

# sed -n '/^$/{p;h;};/./{x;/./p;}' file.txt

-Получает заголовок письма. Другими словами - удаляет все после первой пустой строки.

# sed '/^$/q' 

-Получает тело письма. Другими словами - удаляет все до первой пустой строки.

# sed '1,/^$/d' 

-Удаляет HTML-теги

# sed -e :a -e 's/<[^>]*>//g;/

-Удалить строки с первой и до первой пустой строки:

# sed '1,/^$/ d' имя_файла

Изменение и другое:

-Выполнить несколько действий подряд(ключ -e):

# sed -e '/FILTERS_OUT/,$ d' -e 1,1d -e /require/s/^/\'/
или:
# sed -e 's/This/That/; s/test/another test/' ./myfile

-Выполнить все команды из файла script.sed:

# sed -f script.sed file.txt

-Сжать все последовательные пустые строки до одной. Пустой строки сверху не остается.

# sed '/./,/^$/!d' file.txt

-Сжать все последовательные пустые строки до одной, но оставить верхнюю пустую строку.

# sed '/^$/N;/\n$/D' file.txt

-Если строка заканчивается обратным сплешем, соединить ее со следующей (полезно для скриптов оболочки)

# sed -e :a -e '/\\$/N; s/\\\n/ /; ta' file.txt

-Изменяет только первое соответствие

# sed '0,/RE/s//to_that/' file.txt

-Переводит любое слово, начинающееся с reg или exp в верхний регистр.

# sed -r "s/\<(reg|exp)[a-z]+/\U&/g" 

-Так вы сможете использовать двойные кавычки

# sed 's/14"/fourteen inches/g' file.txt

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

# sed '/^$/N;/\n$/N;//D' file.txt

-Нумерует строки в file.txt

# sed = file.txt | sed 'N;s/\n/\t/' 

-Выровнять текст по правому краю

# sed -e :a -e 's/^.\{1,78\}$/ &/;ta' file.txt

-Выровнять текст по центру

# sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' file.txt

-Удвоить пустые строки:

# sed '/^$/ p file.txt

-Символ & (амперсанд), будучи помещен в состав ЗАМЕНЫ, означает любой найденный в тексте ОБРАЗЕЦ. Например:

# echo 1234 | sed 's/[0-9]*/(&)/'
 (1234) 

-Символ амперсанда можно использовать для удвоения ОБРАЗЦА из цифр:

# echo 123 | sed "s/[0-9][0-9]*/& &/"
 123 123

Условный знак \1 означает первую запомненную часть, \2 - вторую, и так далее, вплоть до девяти запомненных частей.

# echo abcd123 | sed 's/\([a-z]*\).*/\1/'
 abcd

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

# echo smart pidgin |sed 's/\([a-z]*\) \([a-z]*\)/\2 \1/'
 pidgin smart

Знак \1 вовсе не обязан быть только в ЗАМЕНЕ, он может присутствовать также и в ОБРАЗЦЕ -Удалить дубликаты слов:

# echo pidgin pidgin | sed 's/\([a-z]*\) \1/\1/'
 pidgin

-Включить все слова в скобки:

# echo cat dog car | sed 's/[^ ]*/(&)/g'
(cat) (dog) (car) 

-Заменить второе совпавшее слово:

# echo cat dog | sed 's/\([a-z]*\) \([a-z]*\)/\2 /'
dog

В этом примере мы запомнили оба слова, и, поставив второе (dog) на первое место, первое (cat) удалили, поставив в секции ЗАМЕНЫ вместо него пробел. Если мы поставим вместо пробела какое-либо слово, то оно заменит первое (cat):

# echo cat dog | sed 's/\([a-z]*\) \([a-z]*\)/\2 good /'
dog good

-Заменить второе слово примером:

# echo cat dog | sed 's/[a-z]*/good/2' 

Это одно/двух/трех -значное число, которое ставится после последнего разделителя и указывает, какое по счету совпадение подлежит замене. Можно комбинировать цифровой модификатор с модификатором /g. -Заменить слова начиная со второго вхождения словом (delete):

# cat file | sed 's/[a-z]*/(delete)/2g' 

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

# cat file | sed 's/[a-z]*/ /2g'
или:
# cat file | sed 's/[a-z]*//2g' 

Числовой модификатор может быть любым целым числом от 1 до 512. -Если нужно поставить двоеточие после 80 символа каждой строки, то поможет команда:

# sed 's/./&:/80' file.txt

-Изменить регистр первой буквы в слове:

# echo smart pidgin | sed 's/smart/\u&/'
Smart pidgin
или:
# echo little puppy | sed 's/[a-z]*/\u&/2'
little Puppy 

Все примеры в одном спойлере:

Замена:
-Заменить Nick или nick на John:

# sed 's/Nick\|nick/John/g' report.txt
или:
# sed 's/[Nn]ick/John/g' report.txt

-Заменяет foo на bar только в первом вхождении в строке.

# sed 's/foo/bar/' file.txt

-Заменяет foo на bar только в четвертом вхождении в строке:

# sed 's/foo/bar/4' file.txt

-Заменяет foo на bar для всех вхождений в строке.

# sed 's/foo/bar/g' file.txt

-Заменить foo на bar только если строка содержит baz.

# sed '/baz/s/foo/bar/g' file.txt

-Заменить V на (V) в 3ей строке:

# sed '3 s/V/(V)/' gumilev.txt

-Заменить V на (V) в диапазоне строк 2-3:

# sed '2,3 s/V/(V)/' gumilev.txt

-Заменить от второй до последней строки файла:

# sed '2,$ s/v/(v)/i' gumilev.txt

-В строке со словом “утра” заменить в на (в):

# sed '/morning/ s/v/(v)/i' gumilev.txt

-Замена строк между словами “morning” и “day”:

# sed '/morning/,/day/ s/v/(v)/i' gumilev.txt

-Замена строк от первой строки до “снега”:

# sed '1,/snow/ s/v/(v)/i' gumilev.txt

-Замена строк от “снега” и до конца файла:

# sed '/snow/,$ s/v/(v)/i' gumilev.txt

-Заменить значения в БД:

# sed -i -e 's%utf8_general_520_ci%utf8_general_ci%g' pavelwj3_dede.sql

-Заменить домены в файлах:

# find . -type f -name '*' -exec sed -i -r 's%beritaxi.com%cf89767.tmweb.ru%g' {} \; 

-Заменить пути в файлах:

# find . -type f -name '*' -exec sed -i -r 's%home/beri/cf99999.tmweb.ru%home/c/cf99999/public_html%g' {} \; 

-Замена путей Unix

# sed 's/\/some\/UNIX\/path/\/a\/new\/path/g' file.txt

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

# sed 's/\s\+/,/' cut.txt

-Заменяет ham на cheese в file.txt за исключением 5-й строки:

# sed '5!s/ham/cheese/' file.txt

-Заменить повторяющиеся пустые строки на одну пустую строку

# sed -e ':a;/^$/N;/\n$/{D;ba}' file.txt

-Если найден "boom", заменить aaa на bb:

# sed '/boom/s/aaa/bb/' file.txt

-Заменяет one на unos независимо от регистра, поэтому будет напечатано "unos TWO":

# echo ONE TWO | sed "s/one/unos/I" 

-Заменяет /usr/bin на /usr/bin/local в path.txt

# sed 's@/usr/bin@&/local@g' path.txt

-Заменяет на 9999 все значения в первой колонке CSV-файла

# sed 's/^[^,]*,/9999,/' file.csv

-Заменяет Johnson на White только в строках 1 - 20.

# sed '1,20 s/Johnson/White/g' file.txt

-Предыдущий пример наоборот (заменяет везде, кроме строк 1-20)

# sed '1,20 !s/Johnson/White/g' file.txt

-Заменяет только между "from" и "until". Если областей "from"-"until" несколько, заменяет в каждой из них.

# sed '/from/,/until/ { s/\<red\>/magenta/g; s/<blue\>/cyan/g; }' file.txt

-Заменяет только со слова "ENDNOTES:" и до EOF

# sed '/ENDNOTES:/,$ { s/Schaff/Herzog/g; s/Kraft/Ebbing/g; }' file.txt

 

 

Вставка:
-Вставить символ # в начало строки, содержащей текст:

# sed -i '/текст/s/^/#/' file.txt

-Вставить символ # в начало строки, содержащей текст, и начинающейся не с символа #:

# sed -i '/^[^#].*текст/s/^/#/' file.txt

-В начале строки, где есть слово require вставить кавычку('):

# sed /require/s/^/\'/ 

-В конце строки, где есть слово require добавить кавычку('):

# sed /require/s/$q/\'/ 

-Вставить 8 пробелов в начало каждой строки:

# sed 's/^/        /' file.txt > file_new.txt

-Вставляет пустую строку после каждой строки в file.txt:

# sed G file.txt 

-Вставляет две пустые строки после каждой строки в file.txt:

# sed 'G;G' file.txt 

-Вставляет пустую строку под каждой строкой, содержащей regex

# sed '/regex/G' file.txt

-Вставляет пустую строку над и под каждой строкой, содержащей regex

# sed '/regex/{x;p;x;G;}' file.txt

-Вставить слово GHJ в конец каждой строки:

# sed s/$/GHJ/g

-Вставить в начало файла '# vim: ft=ruby' и перенос строки.

# sed '1i # vim: ft=ruby\n' 

-Вставить после 14ой строки"echo "graph_category logger"".

# sed '14a\ echo \"graph_category logger\"' /etc/munin/plugins/command

-Добавить в конец файла "[mounts]" затем перенос на новую строка и "user root".

# sed -i '$ a \\n[mounts]\nuser root' /etc/munin/config

 

 

Вывод:
-Вывести все между строками Of course и attention you pay:

# sed -n '/Of course/,/attention you pay/p' myfile

-Вывесети 1000-ную строку

# sed -n '1000p;1000q' 

-Вывесети строки с 1 по 10:

# sed -n '1,10 p' file.txt

-Вывесети строки с 10 по 20-ую

# sed -n '10,20p;20q' 

-Выводит только строки 12-18 файла file.txt:

# sed -n 12,18p file.txt

-Выводит весь файл file.txt за исключением строк с 12 по 18:

# sed 12,18d file.txt

-Выводит 5 строк после строки содержащей regex

# sed -n '/regex/,+5p' file.txt

-Вывести каждую пятую строку, начиная со второй.

# sed -n '2~5p' file.txt

-Выводит только строки с тремя последовательными цифрами:

# sed -n '/[0-9]\{3\}/p' file.txt

-Выводит строку с первым соответствием RE (регулярного выражения)

# sed -n '/RE/{p;q;}' file.txt

-Выводит абзац только если он содержит regex

# sed '/./{H;$!d;};x;/regex/!d' file.txt

-Выводит абзацы только если они содержат RE1, RE2 и RE3. Порядок RE1, RE2 и RE3 не имеет значения.

# sed -e '/./{H;$!d;}' -e 'x;/RE1/!d;/RE2/!d;/RE3/!d' file.txt

-Выводит строку, находящуюся перед первым соответствием регулярному выражению, но не включающую само соответствие

# sed -n '/regexp/{g;1!p;};h' file.txt

-Выводит строку, находящуюся после первого соответствия регулярному выражению, но не включающую само соответствие

# sed -n '/regexp/{n;p;}' file.txt

-Выводит файл services без закомментированных строк

# sed -e '/^#/d' /etc/services | less

-Вывести только закомментированные строки:

# sed -n '/^#/ p' /boot/grub/menu.lst

-Ищет строки содержащие AAA, BBB и CCC в любом порядке

# sed '/AAA/!d; /BBB/!d; /CCC/!d' file.txt

-Ищет строки содержащие AAA, BBB и CCC в заданном порядке

# sed '/AAA.*BBB.*CCC/!d' file.txt

-Выводит строки длиной 65 символов и более

# sed -n '/^.\{65\}/p' file.txt

-Выводит строки длиной 65 символов и менее

# sed -n '/^.\{65\}/!p' file.txt

-Выводит нечетные строки в файле:

# awk 'NR%2==0' file
или:
# sed ' n; d' file

-Выводит четные строки в файле:

# sed '1d; n; d' file

 

 

Удаление:
-Удалить строку содержащую Network или network.

# sed -i '/[Nn]etwork/d' /file

-Убрать символы # в начале строки, содержащей текст:

# sed -i '/текст/s/^#\+//' file

-Удаляет последнюю строку:

# sed '$d' file.txt

-Удалить 14ую строку:

# sed -i '14d' /file

-Удаляет все строки, начиная с 17-й, до "disk". Если строк с "disk" несколько, удаляет до первой из них:

# sed '17,/disk/d' file.txt

-В общем случае удаляет последний символ в каждой строке:

# sed 's/.$//' file.txt

-Удаляет все пробелы/табы перед каждой строкой в file.txt:

# sed 's/^[ \t]*//' file.txt

-Удаляет все пробелы/табы в конце каждой строки в file.txt:

# sed 's/[ \t]*$//' file.txt

-Удаляет все пробелы/табы в начале и в конце каждой строки в file.txt:

# sed 's/^[ \t]*//;s/[ \t]*$//' file.txt

-Удалить все начальные пустые строки

# sed '/./,$!d' file.txt

-Удалить все замыкающие пустые строки

# sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' file.txt

-Удалить каждую третью строку, начиная с первой.

# sed '1~3d' file.txt

-Удалить все строки кроме второй (!):

# sed '2 !d' gumilev.txt

-Удалить закомментированные строки:

# sed '/^#/ d' /boot/grub/menu.lst

-Удалить все строки включительно до слова keyword:

# sed '1,/keyword/ d' < file

-Удалить все строки включительно начиная со слова FILTERS_OUT:

# sed '/FILTERS_OUT/,$ d' < file

-Удалить текст строки до слова zimbraMailSieveScript:

# sed 's/^zimbraMailSieveScript: //' 

-Удаляет строку с первым соответствием

# sed '0,/RE/{//d;}' file.txt

-Удаляет все символы, начиная с a и заканчивая g из файла file.txt:

# sed 's/[a-g]//g' file.txt

-Удаляет строки, соответствующие шаблону pattern

# sed '/pattern/d' file.txt

-Удаляет все пустые строки из файла

# sed '/./!d' file.txt

-Удаляет последнюю строку каждого абзаца

# sed -n '/^$/{p;h;};/./{x;/./p;}' file.txt

-Получает заголовок письма. Другими словами - удаляет все после первой пустой строки.

# sed '/^$/q' 

-Получает тело письма. Другими словами - удаляет все до первой пустой строки.

# sed '1,/^$/d' 

-Удаляет HTML-теги

# sed -e :a -e 's/<[^>]*>//g;/

-Удалить строки с первой и до первой пустой строки:

# sed '1,/^$/ d' имя_файла

 

 

Изменение и другое:
-Выполнить несколько действий подряд(ключ -e):

# sed -e '/FILTERS_OUT/,$ d' -e 1,1d -e /require/s/^/\'/
или:
# sed -e 's/This/That/; s/test/another test/' ./myfile

-Выполнить все команды из файла script.sed:

# sed -f script.sed file.txt

-Сжать все последовательные пустые строки до одной. Пустой строки сверху не остается.

# sed '/./,/^$/!d' file.txt

-Сжать все последовательные пустые строки до одной, но оставить верхнюю пустую строку.

# sed '/^$/N;/\n$/D' file.txt

-Если строка заканчивается обратным сплешем, соединить ее со следующей (полезно для скриптов оболочки)

# sed -e :a -e '/\\$/N; s/\\\n/ /; ta' file.txt

-Изменяет только первое соответствие

# sed '0,/RE/s//to_that/' file.txt

-Переводит любое слово, начинающееся с reg или exp в верхний регистр.

# sed -r "s/\<(reg|exp)[a-z]+/\U&/g" 

-Так вы сможете использовать двойные кавычки

# sed 's/14"/fourteen inches/g' file.txt

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

# sed '/^$/N;/\n$/N;//D' file.txt

-Нумерует строки в file.txt

# sed = file.txt | sed 'N;s/\n/\t/' 

-Выровнять текст по правому краю

# sed -e :a -e 's/^.\{1,78\}$/ &/;ta' file.txt

-Выровнять текст по центру

# sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' file.txt

-Удвоить пустые строки:

# sed '/^$/ p file.txt

-Символ & (амперсанд), будучи помещен в состав ЗАМЕНЫ, означает любой найденный в тексте ОБРАЗЕЦ. Например:

# echo 1234 | sed 's/[0-9]*/(&)/'
 (1234) 

-Символ амперсанда можно использовать для удвоения ОБРАЗЦА из цифр:

# echo 123 | sed "s/[0-9][0-9]*/& &/"
 123 123

Условный знак \1 означает первую запомненную часть, \2 - вторую, и так далее, вплоть до девяти запомненных частей.

# echo abcd123 | sed 's/\([a-z]*\).*/\1/'
 abcd

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

# echo smart pidgin |sed 's/\([a-z]*\) \([a-z]*\)/\2 \1/'
 pidgin smart

Знак \1 вовсе не обязан быть только в ЗАМЕНЕ, он может присутствовать также и в ОБРАЗЦЕ -Удалить дубликаты слов:

# echo pidgin pidgin | sed 's/\([a-z]*\) \1/\1/'
 pidgin

-Включить все слова в скобки:

# echo cat dog car | sed 's/[^ ]*/(&)/g'
(cat) (dog) (car) 

-Заменить второе совпавшее слово:

# echo cat dog | sed 's/\([a-z]*\) \([a-z]*\)/\2 /'
dog

В этом примере мы запомнили оба слова, и, поставив второе (dog) на первое место, первое (cat) удалили, поставив в секции ЗАМЕНЫ вместо него пробел. Если мы поставим вместо пробела какое-либо слово, то оно заменит первое (cat):

# echo cat dog | sed 's/\([a-z]*\) \([a-z]*\)/\2 good /'
dog good

-Заменить второе слово примером:

# echo cat dog | sed 's/[a-z]*/good/2' 

Это одно/двух/трех -значное число, которое ставится после последнего разделителя и указывает, какое по счету совпадение подлежит замене. Можно комбинировать цифровой модификатор с модификатором /g. -Заменить слова начиная со второго вхождения словом (delete):

# cat file | sed 's/[a-z]*/(delete)/2g' 

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

# cat file | sed 's/[a-z]*/ /2g'
или:
# cat file | sed 's/[a-z]*//2g' 

Числовой модификатор может быть любым целым числом от 1 до 512. -Если нужно поставить двоеточие после 80 символа каждой строки, то поможет команда:

# sed 's/./&:/80' file.txt

-Изменить регистр первой буквы в слове:

# echo smart pidgin | sed 's/smart/\u&/'
Smart pidgin
или:
# echo little puppy | sed 's/[a-z]*/\u&/2'
little Puppy 

 

 

 

 

 

 

Материалы:
http://aidalinux.ru/w/Sed
http://rus-linux.net/MyLDP/consol/sed.html
http://najomi.org/_nix/sed