Описание SED было взято из книги
Linux.Администрирование и системное проrраммирование 2-е издание. Марк Г.Собель
Утилита sed (— потоковый редактор) является пакетным (неинтерак-
тивным) редактором. Она преобразует вводимый поток, который может поступать из
файла или из стандартного ввода. Эта утилита часто используется в канале в качестве
фильтра. Поскольку она осуществляет только один проход вводимой информации,
утилита sed является более эффективным средством по сравнению с таким интерак-
тивным редактором, как ed. Со многими дистрибутивами Linux поставляется утилита
GNU sed, а в системе Mac OS X предоставляется утилита BSD sed
Синтаксис
Для командной строки sed используется следующий синтаксис:
1 |
# sed [-n] программа [список_файлов] |
1 |
# sed [-n] -f файл_программы [список_файлов] |
Утилита sed получает свой ввод из файлов, указанных в командной строке, или из
стандартного ввода. Вывод из sed поступает на стандартный вывод.
Ключи
Ключи, перед которыми стоит двойной дефис (––), работают только под управлением
Linux (в GNU sed). Имена ключей, состоящие из одной буквы, перед которой ставится
одиночный дефис, работают как под Linux (GNU sed), так и под OS X (BSD sed).
1 2 |
––file файл_программы –f файл_программы |
Заставляет sed читать его программу из файла по имени файл_программы, а не
из командной строки. Этот ключ может использоваться в командной строке более
одного раза.
1 |
––help |
Вызывает вывод краткой справки по использованию sed. (Linux)
1 2 |
––in-place[=суффикс] –i[суффикс] |
Редактирует файлы на месте. Без этого ключа sed отправляет выводимую ин-
формацию на стандартный вывод. При использовании этого ключа sed заменяет
обрабатываемый им файл своим выводом. При указании суффикса sed создает
резервную копию исходного файла. У резервной копии сохраняется исходное имя
файла с добавлением к нему суффикса. Если нужно, чтобы между исходным име-
нем файла и суффиксом появилась точка, ее нужно включить в суффикс.
1 2 |
––quiet или –n ––silent |
Заставляет sed не копировать строки на стандартный вывод, за исключением
тех строк, в отношении которых применяется инструкция Print (p) или соответ-
ствующий флаг.
Основы редактора
Программа sed состоит из одной или нескольких строк, имеющих следующий син-
таксис:
1 |
[адрес [,адрес]] инструкция [список_аргументов] |
Адреса являются необязательной частью синтаксиса. Если адрес опустить, sed
обрабатывает все строки ввода. Инструкция— это инструкция редактирования, из-
меняющая текст. Адреса выбирают строку (строки), с которой работает часть команды,
относящаяся к инструкции. Количество и разновидности аргументов в списке_аргу-
ментов зависят от инструкции. Если в одну командную строку нужно поместить не-
сколько команд sed, их следует отделить друг от друга точками с запятой (;).
Утилита sed обрабатывает ввод следующим образом:
1 2 3 4 5 6 7 8 9 10 11 |
1.Читает одну строку ввода из списка_файлов или из стандартного ввода. 2.Читает первую инструкцию из программы или из файла_программы. Если строка ввода выбирается адресом (или адресами), обрабатывает строку ввода согласно инструкции. 3.Читает следующую инструкцию из программы или из файла_программы. Если строка ввода выбирается адресом (или адресами), обрабатывает строку ввода (воз- можно, уже измененную предыдущей инструкцией) согласно инструкции. 4.Повторяет шаг 3 до тех пор, пока не будут выполнены все инструкции в программе или в файле_программы. 5.Начинает с шага 1, если есть еще одна строка ввода; если такой строки нет, sed за- вершает работу. |
Адреса
Номер строки является адресом, выбирающим строку. В качестве особого случая,
номер, обозначенный символом $, является представителем последней строки ввода.
Регулярное выражение является адресом, выбирающим строки, содержащие соот-
ветствующие этому выражению строковые значения. Хотя в качестве ограничителей
регулярных выражений чаще всего используются слэши, sed позволяет использовать
для этих целей любые символы, кроме обратного слэша и разделителя строк.
Кроме того, уже отмечалось, что перед инструкцией может не быть вообще ника-
кого адреса, или же быть один или два адреса (в виде либо номеров строк, либо регу-
лярных выражений). Если адрес не будет указан, sed выбирает все строки, заставляя
инструкцию обрабатывать каждую строку ввода. Указание одного адреса заставляет
инструкцию обрабатывать каждую строку ввода, выбранную адресом. Указание двух
адресов заставляет инструкцию обрабатывать группу строк. В этом случае первый
адрес выбирает первую строку в первой группе. Второй адрес выбирает следующую
за первой строку, соответствующую этому адресу; и эта строка становится последней
строкой первой группы. Если соответствий для второго адреса найдено не будет, то он
укажет на конец файла. После выбора последней строки в группе sed начинает новый
процесс выбора с поиска следующей строки, соответствующей первому адресу. Эта
строка становится первой строкой следующей группы. Утилита sed продолжает этот
процесс, пока не будет пройден весь файл.
Инструкции
Утилита sed использует два буфера. Следующие команды работают
с Областью шаблона, в котором изначально хранится строка ввода,
только что прочитанная sed.
Другой буфер, Область хранения, рассмотрен далее в соответствующем разделе.
1 |
a - (append — добавить) |
Инструкция Добавить добавляет к текущей выбранной строке одну или несколько строк.
Если перед инструкцией Добавить указать
два адреса, она осуществляет добавление к каждой строке, выбранной адресами. Если
перед инструкцией Добавить не указать адрес, добавление будет выполнено в отно-
шении каждой строки ввода. Инструкция Добавить использует следующий формат:
1 2 3 4 5 |
[адрес [,адрес]] a\ текст \ текст \ … текст |
Каждую строку добавляемого текста, кроме последней, нужно заканчивать симво-
лом обратного слэша, который цитирует следующий за ним символ разделителя строк.
Добавляемый текст завершается строкой, не заканчивающейся символом обратного
слэша. Утилита sed всегда выводит добавляемый текст, независимо от того, использу-
ется или нет ключ –n в командной строке. Она выводит текст даже в том случае, если
строка, к которой он добавляется, удалена.
1 |
c - (change — изменить) |
Инструкция Изменить похожа на инструкции
Добавить и Вставить, за исключением того, что она изменяет выбранные строки, делая
их содержимым новый текст. Когда указывается диапазон адресов, инструкция
Изменить заменяет строки этого диапазона одним экземпляром нового текста.
1 |
d - (delete — удалить) |
Инструкция Удалить заставляет sed не выводить
выбранные им строки и не завершать обработку строк. После того как утилита sed
выполнит инструкцию Удалить, она читает следующую строку ввода, а затем начина-
ет все заново, с первой инструкции из программы или из файла_программы.
1 |
i - (insert — вставить) |
Инструкция Вставить идентична инструкции
Добавить, за исключением того, что она помещает новый текст перед выбранной стро-
кой.
1 |
N - (next, в данном случае, следующая без записи) |
Инструкция Следующая (N) читает следующую строку ввода и добавляет ее к текущей строке. Исходная и новая строка отделяются друг от друга вставленным разделителем строк. Команду
N можно использовать для удаления разделителей строк из файла.
1 |
n - (next — следующая) |
Инструкция Следующая (n) выводит текущую
выбранную строку, если это соответствует установленному режиму работы, читает
следующую строку ввода и приступает к обработке новой строки, используя следую-
щую инструкцию из программы или из файла_программы.
1 |
p - (print — вывести) |
Инструкция Вывести записывает выбранные строки
на стандартный вывод, делая это сразу же, без применения к этим строкам всех
следующих инструкций. Эта инструкция отменяет действие ключа командной строки –n.
1 |
q - (quit — завершить) |
Инструкция Завершить заставляет sed немедленно завершить работу.
1 |
r - (read — прочитать) |
Инструкция Прочитать читает содержимое указанного файла и добавляет его к выбранной строке.
После инструкции Прочитать
должен следовать одиночный пробел и имя файла ввода.
1 |
s - (substitute — Подставить) |
Имеющаяся в sed инструкция
Для нее используется следующий формат:
1 |
[адрес[,адрес]] s/шаблон/строка_замены /[g][p][w файл] |
Шаблон — это регулярное выражение, которое традиционно ограничено слэшем (/),
но можно использовать и любой другой символ, кроме пробела и разделителя строк.
Строка_замены следует сразу же за вторым ограничителем и должна быть завершена
таким же ограничителем. Завершающий (третий) ограничитель является обязатель-
ным элементом. Строка_замены может содержать символ амперсанда (&), который
sed заменяет строковым значением, соответствующим шаблону. Пока не будет исполь-
зован флаг g, инструкция Подставить заменяет только первое соответствие шаблону
в каждой выбранной строке.
1 |
Флаг g (global — глобальный режим) |
заставляет инструкцию Подставить заменить
все неперекрывающиеся строковые значения, соответствующие шаблону в выбранных
строках.
1 |
Флаг p (print — вывести) |
заставляет sed отправить все строки, в которых он осу-
ществил подстановку, на стандартный вывод. Этот флаг отменяет действие ключа
командной строки –n.
1 |
Флаг w (write — записать) |
аналогичен флагу p, но отправляет вывод в файл по
имени файл. За флагом w должен следовать одиночный пробел и имя файла вывода.
(write — записать). Эта инструкция аналогична инструкции Вывести,
за исключением того, что она отправляет вывод в файл по имени файл. За инструкци-
ей Записать должен следовать одиночный пробел и имя файла вывода.
Управляющие структуры
1 |
! - (НЕ) |
Заставляет sed применить следующую инструкцию, находящуюся в той же строке, к каждой строке, не выбранной адресной частью инструкции.
Например, 3!d удаляет все строки, кроме строки 3, а $!p выводит все строки, кроме
последней.
1 |
{} (группировка инструкций) |
Когда группа инструкций заключается
в фигурные скобки, одиночный адрес или пара адресов выбирают строки, которые
обрабатываются группой инструкций. Несколько команд, находящихся в одной стро-
ке, отделяются друг от друга точками с запятой (;).
1 |
Инструкции ветвления |
Инструкции ветвления названы в info-странице, посвященной GNU sed,
не иначе как «Commands for sed gurus» («Команды для sed-гуру»)
и предлагают в случае возникновения потребностей в подобных командах рассмотреть
более приемлемый вариант написания программы на языке awk или Perl.
1 |
: метка |
Является идентификатором места внутри sed-программы. Метка ис-
пользуется как цель перехода для инструкций ветвления b или t.
1 |
b [метка] |
Безусловная передача управления на метку.
Без использования метки — пропуск всех оставшихся инструкций для текущей строки и чтение следующей
строки ввода.
1 |
t [метка] |
Передача управления на метку только в том случае, если инструкция
Подставить была успешно выполнена сразу же после чтения строки, прочитанной
непосредственно перед выполнением этой инструкции (условное ветвление). Без ис-
пользования метки — пропуск всех оставшихся инструкций для текущей строки
ввода и чтение следующей строки ввода.
Область хранения
Все ранее рассмотренные команды работают с Областью шаблона, буфером, в котором
изначально содержится строка ввода, только что прочитанная утилитой sed. Область
хранения может содержать данные только в процессе работы с данными, находящи-
мися в Области шаблона; эта область играет роль временного буфера. Пока данные
не записаны в Область хранения, этот буфер остается пустым. В этом разделе рассма-
триваются команды, перемещающие данные между Областью шаблона и Областью
хранения.
1 |
g |
— Копирование содержимого Области хранения в Область шаблона.
Исходное содержимое Области шаблона утрачивается.
1 |
G |
— Добавление разделителя строк и содержимого Области хранения
к Области шаблона.
1 |
h |
— Копирование содержимого Области шаблона в Область хранения.
Исходное содержимое Области хранения утрачивается.
1 |
H |
— Добавление разделителя строк и содержимого Области шаблона
к Области хранения.
1 |
x |
— Обмен содержимым между Областью шаблона и Областью хранения.
Преобразование текста и замена
Замена по умолчанию выполняется в потоке. Это означает что данные считываются со стандартного потока ввода, модифицируются и отправляются на стандартный поток вывода.
1 |
# sed command file.txt |
Если необходимо изменить данные в файле, то можно воспользоваться одним из вариантов:
1.Перенаправление стандартного вывода в новый файл
1 |
# sed command file.txt > newfile.txt |
1 |
# sed 's/dark/black/g' file.txt > filenew.txt |
2.Использование in-place-замены с помощью ключа -i.
1 |
# sed -i command file.txt |
1 |
# sed -i 's/dark/black/g' file.txt |
Для создания бекапа файла перед его изменением добавляем суффикс после опции -i
Например, отредактируем файл file.txt с сохранением бекапа файла с именем file.txt.bak
1 |
# sed -i.bak 's/dark/black/g' file.txt |
Общий формат для замены
1 |
# sed [address1[,address2]]s/pattern/replacement/[flags] file |
Здесь address1 и address2 являются начальным и конечным адресами соответственно, которые могут быть либо номерами строк, либо строками шаблонов. Оба этих адреса являются необязательными параметрами. Шаблон — это текст, который мы хотим заменить заменяющей строкой. Кроме того, мы можем указать необязательные флаги с SED.
При поиске и замене прямых слешей / их нужно экранировать символом обратного слеша (\)
Например,необходимо заменить http://record на http://record2
1 |
# sed -i 's/http:\/\/record/http:\/\/record2/g' file.txt |
Либо использовать другой разделить(например, |),который будет заменять стандартный разделить /
1 |
# sed -i 's|http://record|http://record2|g' file.txt |
Замена foo на bar только в первом совпадении в каждой строке
1 |
# sed 's/foo/bar/' file.txt |
Замена foo на bar только четыртого совпадения в каждой строке
1 |
# sed 's/foo/bar/4' file.txt |
Замена foo на bar для всех совпадений в каждой строке
1 |
# sed 's/foo/bar/g' file.txt |
Замена foo на bar для всех совпадений только во 2-й строке
1 |
# sed '2s/foo/bar/g' file.txt |
Замена foo на bar для всех совпадений в строке во всех строках за исключением второй строки
1 |
# sed '2!s/foo/bar/g' file.txt |
Замена foo на bar только в 1-й,2-й,3-й строках
1 |
# sed '1,3s/foo/bar/g' file.txt |
Замена foo на bar во всех строках за исключением 1-й,2-й,3-й строк
1 |
# sed '1,3!s/foo/bar/g' file.txt |
Замена foo на bar начиная с 3-й строки и до конца файла
1 |
# sed '3,$s/foo/bar/g' file.txt |
Замена foo на bar ТОЛЬКО в строках, которые содержат baz
1 |
# sed '/baz/s/foo/bar/g' file.txt |
Замена foo на bar КРОМЕ тех строк, которые содержат baz
1 |
# sed '/baz/!s/foo/bar/g' file.txt |
Регистронезависимая замена for на bar
1 |
# sed -n 's/FOR/bar/pi' file.txt |
Замена «dark» или «brown» или «green» на «red»
1 |
# sed 's/dark/red/g;s/brown/red/g;s/green/red/g' file.txt |
Или
1 |
# sed 's/dark\|brown\|green/red/g' file.txt |
Замена только первого вхождения регулярного выражения (regexp на newword)
1 |
# sed '0,/regexp/s//newword/' file.txt |
Замена foo на bar и one на two только после слова mykeyword и до конца файла
1 |
# sed '/mykeyword/,$ {s/foo/bar/g; s/one/two/g; }' file.txt |
Замена путей в Linux
1 |
# sed 's/\/path\/to\/folder/\/new\/path\/to\/folder/g' file.txt |
Или с использованием другого разделителя(|)
1 |
# sed 's|/path/to/folder|/new/path/to/folder|g' file.txt |
Замена повторяющихся пустых строк на одну пустую строку (аналог команды cat -s)
1 |
# sed -e ':a;/^$/N;/\n$/{D;ba}' file.txt |
Или
1 |
# sed '1s/^$//p;/./,/^$/!d' file.txt |
Замена dark на green между регулярными выражениями begin и end
1 |
# sed '/begin/,/end/ s/dark/green/' file.txt |
Преобразование переносов строк DOS (CR/LF) в Unix (LF)(подразумевается что все строки заканчиваются с CR/LF)
1 |
# sed 's/.$//' dosfile.txt > unixfile.txt |
Если строка заканчивается на backslash (\), присоединить следующую строку к ней
1 |
# sed -e :a -e '/\\$/N; s/\\\n//; ta' file.txt |
Замена регистра (аналог команды tr)
1 |
# sed 'y/ABC/abc/' file.txt |
Замена всех пробелов на символ табуляции
1 |
# sed 's/ /\t/g' file.txt |
Замена всех символов табуляции на пробелы(аналог команды expand)
1 |
# sed 's/\t/ /g' file.txt |
Просмотр скрытых символов (окончания строки-$, табуляции — \t)
1 |
# sed -n 'l' file.txt |
Вставка одной пустой строку после каждой строки файла file.txt
1 |
# sed 'G' file.txt |
Вставка двух пустых строк после каждой строки файла file.txt
1 |
# sed 'G;G' file.txt |
Вставка трех пробелов перед каждой строкой в файле file.txt (создать смещение страницы)
1 |
# sed 's/^/ /' file.txt |
Вставка пустой строки после каждой строкой, содержащей regexp
1 |
# sed '/regexp/G' file.txt |
Вставка пустой строки перед каждой строкой, содержащей regexp
1 |
# sed '/regexp/{x;p;x;}' file.txt |
Вставка пустой строки перед и после каждой строкой, содержащей regexp
1 |
# sed '/regexp/{x;p;x;G;}' file.txt |
Вставка символа пробела в начало каждой строки
1 |
# sed 's/^/ /' file.txt |
Вставка символа пробела в начало каждой НЕПУСТОЙ строки
1 |
# sed 's/^./ &/' file.txt |
Вставка символа комментария в начале каждой строки
1 |
# sed 's/^/#/' file.txt |
Вставка символа комментария в начале каждой НЕПУСТОЙ строки
1 |
# sed 's/^./#&/' file.txt |
Вставка символа табуляции в начале каждой строки
1 |
# sed 's/^/\t/' file.txt |
Вставка символа табуляции в начале каждой НЕПУСТОЙ строки
1 |
# sed 's/^./\t&/' file.txt |
Вставка символа комментария в начале строк с третьей по пятую включительно
1 |
# sed '3,5s/^/#/' file.txt |
Вставка (a), добавление(i) и замена(с) строк, чтение файла(r)
a-добавление строки ПОСЛЕ указанной строки
1 |
# echo "Line number one" | sed 'a\Line number two' |
1 2 |
Line number one Line number two |
i-вставка строки ПЕРЕД указанной строкой
1 |
# echo "Line number two" | sed 'i\Line number one' |
1 2 |
Line number one Line number two |
Вставка 10-й строкой текста
1 |
# sed '9a\Line number ten' file.txt |
1 |
# sed '10i\Line number ten' file.txt |
Добавление строки Add this line after every line with WORD после каждой строки, содержащей регулярное выражение WORD
1 |
# sed '/WORD/ a Add this line after every line with WORD' file.txt |
Вставка строки Add this line before every line with WORD перед каждой строкой, содержащей регулярное выражение WORD
1 |
# sed '/WORD/ i Add this line before every line with WORD' file.txt |
Замена строки, содержащей регулярное выражение WORD на строку Replace the current line with the line
1 |
# sed '/WORD/ c Replace the current line with the line' file.txt |
Замена строк с 4-й по 6-ю включительно указанной строкой
1 |
# sed '4, 6 c This line removes lines from fourth through sixth and replaces them with this line' file.txt |
Вставка cодержимого файла file2.txt в файл file.txt после третьей строки
1 |
# sed '3 r file2.txt' file.txt |
Вставка cодержимого файла file2.txt в файл file.txt после третьей, четвертой и пятой строк
1 |
# sed '3,5 r file2.txt' file.txt |
Вставка cодержимого файла file2.txt в файл file.txt после строки, содержащей рег.выражение
1 |
# sed '/regexp/ r file2.txt' file.txt |
Удаление определенных строк
Удаление последней строки
1 |
# sed '$d' file.txt |
Удаление 2 последних строк файла
1 |
# sed 'N;$!P;$!D;$d' file.txt |
Удаление 10 последних строк файла
1 |
# sed -e :a -e '$d;N;2,10ba' -e 'P;D' file.txt |
Или
1 |
# sed -n -e :a -e '1,10!{P;N;D;};N;ba' file.txt |
Удаление третьей строки
1 |
# sed '3d' file.txt |
Удаление 2,3,4 строк
1 |
# sed '2,4d' file.txt |
Удаление всех строк начиная с 3-й строки и до конца файла
1 |
# sed '3,$d' file.txt |
Удаление строк совпадающие с регулярным выражением
1 |
# sed '/regexp/d' file.txt |
Удаление строк НЕ совпадающих с регулярным выражением
1 |
# sed '/regexp/!d' file.txt |
Удаление всех строк между регулярными выражениями включая строки, содержащие эти регулярные выражения
1 |
# sed '/regexp1/, /regexp2/ d' file.txt |
Удаление строки с первым совпадением шаблона
1 |
# sed '0,/regexp/{//d;}' file.txt |
Удаление всех строк, начиная с 11й, до строки, содержащей слово «mykeyword «. Если строк с «mykeyword» несколько, то удаляет до первой из них.
1 |
# sed '11,/mykeyword/d' file.txt |
Удаление всех пробелов/символов табуляции в начале каждой строки файла
1 |
# sed 's/^[ \t]*//' file.txt |
Удаление всех пробелов/символов табуляции в конце каждой строки файла
1 |
# sed 's/[ \t]*$//' file.txt |
Удаление пробелов/символов табуляции в начале и в конце каждой строки файла
1 |
# sed 's/^[ \t]*//;s/[ \t]*$//' file.txt |
Удаление всех начальных пустых строк
1 |
# sed '/./,$!d' file.txt |
Удаление всех замыкающих пустых строк
1 |
# sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' file.txt |
Или
1 |
# sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' file.txt |
Удаление всех пустых строк
1 |
# sed '/./!d' file.txt |
Или
1 |
# sed '/^$/d' file.txt |
Удаление комментариев и пустых строк
1 |
# sed '/ *#/d; /^ *$/d' file.txt |
Или
1 |
# sed -e 's/#.*//' -e '/^$/ d' file.txt |
Удаление пустых строк с любым кол-вом пробелов в этих строках
1 |
# sed '/^\s*$/d' file.txt |
Удаление первого символа пробела во всех строках
1 |
# sed 's/^.//' file.txt |
Удаление первого символа пробела в первой строке
1 |
# sed '1s/^.//' file.txt |
Выборочный вывод/печать определенных строк
Вывод первых десяти строк файла file.txt (аналог команды head)
1 |
# sed 10q file.txt |
Вывод первой строки файла file.txt (аналог команды head -1)
1 |
# sed q file.txt |
Вывод последних десяти строк файла file.txt (аналог команды tail)
1 |
# sed -e :a -e '$q;N;11,$D;ba' file.txt |
Вывод последних двух строк файла file.txt (аналог команды tail -n 2)
1 |
# sed '$!N;$!D' file.txt |
Вывод последней строки файла file.txt (аналог команды tail -1)
1 |
# sed '$!d' file.txt |
Или
1 |
# sed -n '$p' file.txt |
Вывод только дубликатов строк
1 |
# sed '$!N; s/^\(.*\)\n\1$/\1/; t; D' file.txt |
Вывод второй строки
1 |
# sed -n '2p' file.txt |
Или
1 |
# sed '2!d' file.txt |
Или
1 |
# sed '2q;d' file.txt |
Вывод строк со второй по четвертую
1 |
# sed -n '2,4p' file.txt |
Или
1 |
# sed '2,4!d' file.txt |
Вывод всех нечетных строк
1 |
# sed -n '1~2 p' file.txt |
Вывод всех четных строк
1 |
# sed -n '2~2 p' file.txt |
Вывод строк,которые содержат регулярное выражение (аналог команды grep)
1 |
# sed -n '/regexp/p' file.txt |
Или
1 |
# sed '/regexp/!d' file.txt |
Вывод строк,которые НЕ содержат регулярное выражение (аналог команды grep -v)
1 |
# sed -n '/regexp/!p' file.txt |
Или
1 |
# sed '/regexp/d' file.txt |
Вывод строки с первым соответствием регулярному выражению
1 |
# sed -n '/regexp/{p;q;}' file.txt |
Вывод строк начиная со строки, которая содержит регулярное выражение и до конца файла
1 |
# sed -n '/regexp/,$p' file.txt |
Вывод строк между двумя рег.выражениями
1 |
# sed -n '/regexp1/, /regexp2/ p' file.txt |
Вывод строки содержащей рег.выражение и следующих за этой строкой трех строк
1 |
# sed -n '/regexp/, +3 p' file.txt |
Вывод строки находящейся непосредственно перед соответствующей регулярному выражению строкой, но не включая строку, содержащую регулярное выражение
1 |
# sed -n '/regexp/{g;1!p;};h' file.txt |
Вывод строки находящейся непосредственно после соотвествующей регулярному выражению строкой, но не включая строку, содержащую регулярное выражение
1 |
# sed -n '/regexp/{n;p;}' file.txt |
Вывод по одной строке перед и после регулярного выражения, с
указанием номера строки совпадающей с регулярным выражением (аналог команды grep -A1 -B1):
1 |
# sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h file.txt |
Вывод строк, совпадающих с регулярными выражениями AAA, BBB и CCC
одновременно (в любой последовательности):
1 |
# sed '/AAA/!d; /BBB/!d; /CCC/!d' file.txt |
Вывод строк, совпадающих с регулярными выражениями AAA, BBB и CCC
одновременно (в конкретной последовательности):
1 |
# sed '/AAA.*BBB.*CCC/!d' file.txt |
Вывод строк, совпадающих с любым регулярным выражением AAA или BBB, или CCC (аналог команды egrep ):
1 |
# sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d file.txt |
Или
1 |
# sed '/AAA/b;/BBB/b;/CCC/b;d' file.txt |
Или
1 |
# sed '/AAA\|BBB\|CCC/!d' file.txt |
Вывод количества строк (аналог команды wc -l)
1 |
# sed -n '$=' file.txt |
Вывод номеров строк,в которых встречается регулярное выражение
1 |
# sed -n '/regexp/ =' file.txt |
Вывод файла без комментариев
1 |
# sed '/^#/d' file.txt |
Вывод номеров строк
1 |
# sed '=' file.txt |
Вывод номеров строк в файле file.txt. Используя отступ (tab) вместо пустой строки:
1 |
# sed = file.txt | sed 'N;s/\n/\t/' |
Выравнивание текста по правому краю шириной в 79 символов (устанавливает как 78 плюс 1 пробельный символ)
1 |
# sed -e :a -e 's/^.\{1,78\}$/ &/;ta' file.txt |
Выравнивание текста по центру
1 |
# sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' file.txt |
Вывод строк длиной равной или большей 5 символов:
1 |
# sed -n '/^.\{5\}/p' file.txt |
Вывод строк длиной меньше5 символов:
1 |
# sed -n '/^.\{5\}/!p' file.txt |
Или
1 |
# sed '/^.\{5\}/d' file.txt |
Вывод измененных строк после замены
1 |
# sed -n 's/for/bar/p' file.txt |
Запись измененных строк в файл(между опцией w и именем файла должен быть только один пробел)
1 |
# sed -n 's/for/bar/w сhanges.txt' file.txt |
Поддержка регулярных выражений
Стандартные регулярные выражения
Начало строки (^)
1 |
# echo -e "hello world" | sed -n '/^hello/ p' |
1 |
hello world |
Конец строки ($)
1 |
# echo -e "hello world" | sed -n '/world$/ p' |
1 |
hello world |
Одиночный символ(.)
1 |
# echo -e "cat\nbat\nrat\nbatting\nrats\nmats" | sed -n '/^..t$/p' |
1 2 3 |
cat bat rat |
Набор символов ([])
Достаточно совпадения одного символа из указанного набора символов
1 |
# echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p' |
1 2 |
Call Tall |
Исключающий набор символов ([^])
В исключающем наборе каретка отменяет набор символов в квадратных скобках.
1 |
# echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p' |
1 |
Ball |
Диапазон символов ([-])
Совпадение с любым символом из диапазона, указанного в квадратных скобках
1 |
# echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p' |
1 2 |
Call Tall |
Ноль или один символ (\?)
1 |
# echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p' |
1 2 |
Behaviour Behavior |
Один или более символов (\+)
1 |
# echo -e "111\n22\n123\n234\n456\n222" | sed -n '/2\+/ p' |
1 2 3 4 |
22 123 234 222 |
Ноль или больше символов (*)
1 |
# echo -e "ca\ncat" | sed -n '/cat*/ p' |
1 2 |
ca cat |
Точно N символов {n}
1 |
# cat numbers.txt |
1 2 3 4 5 6 7 8 9 10 |
1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 |
1 |
# sed -n '/^[0-9]\{3\}$/ p' numbers.txt |
1 |
100 |
Не меньше N символов {n,}
1 |
# sed -n '/^[0-9]\{5,\}$/ p' numbers.txt |
1 2 3 4 5 6 |
10000 100000 1000000 10000000 100000000 1000000000 |
Не меньше M и не больше N {m, n}
1 |
# sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt |
1 2 3 4 |
10000 100000 1000000 10000000 |
Поток – pipe (|)
Символ | в SED означает логический оператор ИЛИ
1 |
# echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p' |
1 2 |
str1 str3 |
Экранирование специальных символов
Экранирвание символа обратного слеша \
1 |
# echo 'str1\str2' | sed -n '/\\/ p' |
1 |
str1\str2 |
Экранирование символа новой строки \n
1 |
# echo 'str1\nstr2' | sed -n '/\\n/ p' |
1 |
str1\nstr2 |
Экранирование символа возврата каретки
1 |
# echo 'str1\rstr2' | sed -n '/\\r/ p' |
1 |
str1\rstr2 |
POSIX-регулярные выражения
1 |
[:alnum:] |
Включает буквы и цифры
1 |
# echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p' |
1 2 |
One 123 |
1 |
[:alpha:] |
Включает только буквы
1 |
# echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p' |
1 |
One |
1 |
[:digit:] |
Включает только цифры
1 |
# echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p' |
1 |
123 |
1 |
[:space:] |
Включает пустые символы – как пробелы, так и символы табуляции
1 |
# echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte |
1 |
^I$ |
Команда cat -vte используется, чтобы показать символ табуляции
1 |
[:lower:] |
Включает только строчные буквы
1 |
# echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p' |
1 |
one |
1 |
[:upper:] |
Включает только буквы в верхнем регистре
1 |
# echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p' |
1 |
TWO |
1 |
[:punct:] |
Включает знаки препинания
1 |
# echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p' |
1 |
One,Two |
1 |
[:space:] |
Включает пробелы
1 |
# echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte |
1 |
123^L^I$ |
Использование SED в качестве замены других команд
Просмотр содержимого файла (аналог команды cat)
1 |
# sed '' file.txt |
1 |
# sed -n 'p' file.txt |
Обратный порядок строк(аналог команды tac)
1 |
# sed '1!G;h;$!d' file.txt |
Или
1 |
# sed '2,$G;h;$!d' file.txt |
Обратный порядок символов в каждой строке (аналог команды rev)
1 |
# sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' file1.txt |
Удаление дубликатов последовательных строк в файле(аналог команды uniq) Первая строка в наборе дубликатах строк удерживается от удаления
1 |
# sed '$!N; /^\(.*\)\n\1$/!P; D' file.txt |
Отображение символа конца строки($)(аналог команды cat -E)
1 |
# sed 's|$|&$|' file.txt |
Отображение символа конца строки($) и символа табуляции (^I)(аналог команды cat -ET)
1 |
# sed -n 'l' file.txt | sed 'y/\\t/^I/' |
Копирование файла (аналог команды cp)
1 |
# sed -n 'w duplicate.txt' file.txt |
Вывод данных, как на стандартный поток вывода, так и в файл (аналог команды tee)
1 |
# sed -n 'p; w new.txt' file.txt |
Другие полезные команды использования SED
Удалить первую строку с файлов,указанных в файле /root/2.txt
1 |
# for file in `cat /root/2.txt`; do sed -i -e "1d" $file; done |
Добавить первую строку в файлы, указанные в файле /root/2.txt
1 |
# for file in `cat /root/2.txt`; do sed -i '1 i\<?php' $file; done |
Замена http на https по всему SQL-дампу
1 |
# sed -i 's|http://mydomain.com|https://mydomain.com|g' dump.sql |
Добавить содержимое файла /root/spam.txt во все файлы,указаные в файле /root/2.txt после
строки,которая содержит код Set Referrer Spam as spambot
1 |
# for file in `cat /root/2.txt`; do sed -i -e "/Set Referrer Spam as spambot/r/"/root/spam.txt"" $file |
Добавление символа комментария(#) в начало каждой строке, в которой найдено вхождение/паттерн $CURL в файле file.txt
1 |
# sed -i /\$CURL/s/^/#/ file.txt |
Удаление расширения файлов(.conf)
1 |
# ls -l /etc/apache2/plesk.conf.d/vhosts | sed -e 's/\.conf//' |
Замена расширения файла
1 |
# for i in `ls -1`; do mv $i `echo $i | sed 's/.*\.txt$/.text`; done |
Замена oldtext на newtext во всех файлах с именами, которые заканчиваются на .txt
1 |
# find . -name "*.txt" -exec sed -i "s/oldtext/newtext/g" '{}' \; |
Найти каждую строку в файле, содержащую ШАБЛОН и заменить каждую такую найденную строку, другой строкой — ЗАМЕНЯЮЩАЯ_СТРОКА
Чтобы заменить целую строку с помощью sed, необходимо в начале и в конце шаблона, по которому мы ищем строки, добавить wildcards (.*).
1 |
# sed -i 's/.*ШАБЛОН.*/ЗАМЕНЯЮЩАЯ_СТРОКА/' file.txt |
Использование переменных в SED
Можно использовать переменные в SED обрамляя при этом команду sed в двойные кавычки вместо одинарных кавычек.
1 |
# sed "s/$var/r_str/g" file.txt > filenew.txt |
Источник:
Linux.Администрирование и системное проrраммирование 2-е издание. Марк Г.Собель
http://sed.sourceforge.net/sed1line.txt
http://ant0.ru/sed1line.html
http://www.grymoire.com/Unix/sed.html
http://www.tutorialspoint.com/sed/
http://rus-linux.net/MyLDP/consol/sed.html