Использование SED. Полезные команды SED

Описание SED было взято из книги
Linux.Администрирование и системное проrраммирование 2-е издание. Марк Г.Собель

Утилита sed (— потоковый редактор) является пакетным (неинтерак-
тивным) редактором. Она преобразует вводимый поток, который может поступать из
файла или из стандартного ввода. Эта утилита часто используется в канале в качестве
фильтра. Поскольку она осуществляет только один проход вводимой информации,
утилита sed является более эффективным средством по сравнению с таким интерак-
тивным редактором, как ed. Со многими дистрибутивами Linux поставляется утилита
GNU sed, а в системе Mac OS X предоставляется утилита BSD sed

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

Утилита sed получает свой ввод из файлов, указанных в командной строке, или из
стандартного ввода. Вывод из sed поступает на стандартный вывод.

Ключи
Ключи, перед которыми стоит двойной дефис (––), работают только под управлением
Linux (в GNU sed). Имена ключей, состоящие из одной буквы, перед которой ставится
одиночный дефис, работают как под Linux (GNU sed), так и под OS X (BSD sed).

Заставляет sed читать его программу из файла по имени файл_программы, а не
из командной строки. Этот ключ может использоваться в командной строке более
одного раза.

Вызывает вывод краткой справки по использованию sed. (Linux)

Редактирует файлы на месте. Без этого ключа sed отправляет выводимую ин-
формацию на стандартный вывод. При использовании этого ключа sed заменяет
обрабатываемый им файл своим выводом. При указании суффикса sed создает
резервную копию исходного файла. У резервной копии сохраняется исходное имя
файла с добавлением к нему суффикса. Если нужно, чтобы между исходным име-
нем файла и суффиксом появилась точка, ее нужно включить в суффикс.

Заставляет sed не копировать строки на стандартный вывод, за исключением
тех строк, в отношении которых применяется инструкция Print (p) или соответ-
ствующий флаг.

Основы редактора
Программа sed состоит из одной или нескольких строк, имеющих следующий син-
таксис:

Адреса являются необязательной частью синтаксиса. Если адрес опустить, sed
обрабатывает все строки ввода. Инструкция— это инструкция редактирования, из-
меняющая текст. Адреса выбирают строку (строки), с которой работает часть команды,
относящаяся к инструкции. Количество и разновидности аргументов в списке_аргу-
ментов зависят от инструкции. Если в одну командную строку нужно поместить не-
сколько команд sed, их следует отделить друг от друга точками с запятой (;).
Утилита sed обрабатывает ввод следующим образом:

Адреса
Номер строки является адресом, выбирающим строку. В качестве особого случая,
номер, обозначенный символом $, является представителем последней строки ввода.
Регулярное выражение является адресом, выбирающим строки, содержащие соот-
ветствующие этому выражению строковые значения. Хотя в качестве ограничителей
регулярных выражений чаще всего используются слэши, sed позволяет использовать
для этих целей любые символы, кроме обратного слэша и разделителя строк.
Кроме того, уже отмечалось, что перед инструкцией может не быть вообще ника-
кого адреса, или же быть один или два адреса (в виде либо номеров строк, либо регу-
лярных выражений). Если адрес не будет указан, sed выбирает все строки, заставляя
инструкцию обрабатывать каждую строку ввода. Указание одного адреса заставляет
инструкцию обрабатывать каждую строку ввода, выбранную адресом. Указание двух
адресов заставляет инструкцию обрабатывать группу строк. В этом случае первый
адрес выбирает первую строку в первой группе. Второй адрес выбирает следующую
за первой строку, соответствующую этому адресу; и эта строка становится последней
строкой первой группы. Если соответствий для второго адреса найдено не будет, то он
укажет на конец файла. После выбора последней строки в группе sed начинает новый
процесс выбора с поиска следующей строки, соответствующей первому адресу. Эта
строка становится первой строкой следующей группы. Утилита sed продолжает этот
процесс, пока не будет пройден весь файл.

Инструкции
Утилита sed использует два буфера. Следующие команды работают
с Областью шаблона, в котором изначально хранится строка ввода,
только что прочитанная sed.
Другой буфер, Область хранения, рассмотрен далее в соответствующем разделе.

Инструкция Добавить добавляет к текущей выбранной строке одну или несколько строк.
Если перед инструкцией Добавить указать
два адреса, она осуществляет добавление к каждой строке, выбранной адресами. Если
перед инструкцией Добавить не указать адрес, добавление будет выполнено в отно-
шении каждой строки ввода. Инструкция Добавить использует следующий формат:

Каждую строку добавляемого текста, кроме последней, нужно заканчивать симво-
лом обратного слэша, который цитирует следующий за ним символ разделителя строк.
Добавляемый текст завершается строкой, не заканчивающейся символом обратного
слэша. Утилита sed всегда выводит добавляемый текст, независимо от того, использу-
ется или нет ключ –n в командной строке. Она выводит текст даже в том случае, если
строка, к которой он добавляется, удалена.

Инструкция Изменить похожа на инструкции
Добавить и Вставить, за исключением того, что она изменяет выбранные строки, делая
их содержимым новый текст. Когда указывается диапазон адресов, инструкция
Изменить заменяет строки этого диапазона одним экземпляром нового текста.

Инструкция Удалить заставляет sed не выводить
выбранные им строки и не завершать обработку строк. После того как утилита sed
выполнит инструкцию Удалить, она читает следующую строку ввода, а затем начина-
ет все заново, с первой инструкции из программы или из файла_программы.

Инструкция Вставить идентична инструкции
Добавить, за исключением того, что она помещает новый текст перед выбранной стро-
кой.

Инструкция Следующая (N) читает следующую строку ввода и добавляет ее к текущей строке. Исходная и новая строка отделяются друг от друга вставленным разделителем строк. Команду
N можно использовать для удаления разделителей строк из файла.

Инструкция Следующая (n) выводит текущую
выбранную строку, если это соответствует установленному режиму работы, читает
следующую строку ввода и приступает к обработке новой строки, используя следую-
щую инструкцию из программы или из файла_программы.

Инструкция Вывести записывает выбранные строки
на стандартный вывод, делая это сразу же, без применения к этим строкам всех
следующих инструкций. Эта инструкция отменяет действие ключа командной строки –n.

Инструкция Завершить заставляет sed немедленно завершить работу.

Инструкция Прочитать читает содержимое указанного файла и добавляет его к выбранной строке.

После инструкции Прочитать
должен следовать одиночный пробел и имя файла ввода.

Имеющаяся в sed инструкция
Для нее используется следующий формат:

Шаблон — это регулярное выражение, которое традиционно ограничено слэшем (/),
но можно использовать и любой другой символ, кроме пробела и разделителя строк.
Строка_замены следует сразу же за вторым ограничителем и должна быть завершена
таким же ограничителем. Завершающий (третий) ограничитель является обязатель-
ным элементом. Строка_замены может содержать символ амперсанда (&), который
sed заменяет строковым значением, соответствующим шаблону. Пока не будет исполь-
зован флаг g, инструкция Подставить заменяет только первое соответствие шаблону
в каждой выбранной строке.

заставляет инструкцию Подставить заменить
все неперекрывающиеся строковые значения, соответствующие шаблону в выбранных
строках.

заставляет sed отправить все строки, в которых он осу-
ществил подстановку, на стандартный вывод. Этот флаг отменяет действие ключа
командной строки –n.

аналогичен флагу p, но отправляет вывод в файл по
имени файл. За флагом w должен следовать одиночный пробел и имя файла вывода.
(write — записать). Эта инструкция аналогична инструкции Вывести,
за исключением того, что она отправляет вывод в файл по имени файл. За инструкци-
ей Записать должен следовать одиночный пробел и имя файла вывода.

Управляющие структуры

Заставляет sed применить следующую инструкцию, находящуюся в той же строке, к каждой строке, не выбранной адресной частью инструкции.
Например, 3!d удаляет все строки, кроме строки 3, а $!p выводит все строки, кроме
последней.

Когда группа инструкций заключается
в фигурные скобки, одиночный адрес или пара адресов выбирают строки, которые
обрабатываются группой инструкций. Несколько команд, находящихся в одной стро-
ке, отделяются друг от друга точками с запятой (;).

Инструкции ветвления названы в info-странице, посвященной GNU sed,
не иначе как «Commands for sed gurus» («Команды для sed-гуру»)
и предлагают в случае возникновения потребностей в подобных командах рассмотреть
более приемлемый вариант написания программы на языке awk или Perl.

Является идентификатором места внутри sed-программы. Метка ис-
пользуется как цель перехода для инструкций ветвления b или t.

Безусловная передача управления на метку.
Без использования метки — пропуск всех оставшихся инструкций для текущей строки и чтение следующей
строки ввода.

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

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

— Копирование содержимого Области хранения в Область шаблона.
Исходное содержимое Области шаблона утрачивается.

— Добавление разделителя строк и содержимого Области хранения
к Области шаблона.

— Копирование содержимого Области шаблона в Область хранения.
Исходное содержимое Области хранения утрачивается.

— Добавление разделителя строк и содержимого Области шаблона
к Области хранения.

— Обмен содержимым между Областью шаблона и Областью хранения.

 

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

Замена по умолчанию выполняется в потоке. Это означает что данные считываются со стандартного потока ввода, модифицируются и отправляются на стандартный поток вывода.

Если необходимо изменить данные в файле, то можно воспользоваться одним из вариантов:
1.Перенаправление стандартного вывода в новый файл

2.Использование in-place-замены с помощью ключа -i.

Для создания бекапа файла перед его изменением добавляем суффикс после опции -i
Например, отредактируем файл file.txt с сохранением бекапа файла с именем file.txt.bak

Общий формат для замены

Здесь address1 и address2 являются начальным и конечным адресами соответственно, которые могут быть либо номерами строк, либо строками шаблонов. Оба этих адреса являются необязательными параметрами. Шаблон — это текст, который мы хотим заменить заменяющей строкой. Кроме того, мы можем указать необязательные флаги с SED.

При поиске и замене прямых слешей / их нужно экранировать символом обратного слеша (\)
Например,необходимо заменить http://record на http://record2

Либо использовать другой разделить(например, |),который будет заменять стандартный разделить /

Замена foo на bar только в первом совпадении в каждой строке

Замена foo на bar только  четыртого совпадения в каждой строке

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

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

Замена foo на bar для всех совпадений в строке во всех строках за исключением второй строки

Замена foo на bar только в 1-й,2-й,3-й строках

Замена foo на bar во всех строках за исключением 1-й,2-й,3-й строк

Замена foo на bar начиная с 3-й строки и до конца файла

Замена foo на bar ТОЛЬКО в строках, которые содержат baz

Замена foo на bar КРОМЕ тех строк, которые содержат baz

Регистронезависимая замена for на bar

Замена «dark» или «brown» или «green» на «red»

Или

Замена только первого вхождения регулярного выражения (regexp на newword)

Замена foo на bar и one на two только после слова mykeyword и до конца файла

Замена путей в Linux

Или с использованием другого разделителя(|)

Замена повторяющихся пустых строк на одну пустую строку (аналог команды cat -s)

Или

Замена dark на green между регулярными выражениями begin и end

Преобразование переносов строк DOS (CR/LF) в Unix (LF)(подразумевается что все строки заканчиваются с CR/LF)

Если строка заканчивается на backslash (\), присоединить следующую строку к ней

Замена регистра (аналог команды tr)

Замена всех пробелов на символ табуляции

Замена всех символов табуляции на пробелы(аналог команды expand)

Просмотр скрытых символов (окончания строки-$, табуляции — \t)

Вставка одной пустой строку после каждой строки файла file.txt

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

Вставка трех пробелов перед каждой строкой в файле file.txt (создать смещение страницы)

Вставка пустой строки после каждой строкой, содержащей regexp

Вставка пустой строки перед каждой строкой, содержащей regexp

Вставка пустой строки перед и после каждой строкой, содержащей regexp

Вставка символа пробела в начало каждой строки

Вставка символа пробела в начало каждой НЕПУСТОЙ строки

Вставка символа комментария в начале каждой строки

Вставка символа комментария в начале каждой НЕПУСТОЙ строки

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

Вставка символа табуляции в начале каждой НЕПУСТОЙ строки

Вставка символа комментария в начале строк с третьей по пятую включительно

 

Вставка (a), добавление(i) и замена(с) строк, чтение файла(r)
a-добавление строки ПОСЛЕ указанной строки

i-вставка строки ПЕРЕД указанной строкой

Вставка 10-й строкой текста

Добавление строки Add this line after every line with WORD после каждой строки, содержащей регулярное выражение WORD

Вставка строки Add this line before every line with WORD перед каждой строкой, содержащей регулярное выражение WORD

Замена строки, содержащей регулярное выражение WORD на строку Replace the current line with the line

Замена строк с 4-й по 6-ю включительно указанной строкой

Вставка cодержимого файла file2.txt в файл file.txt после третьей строки

Вставка cодержимого файла file2.txt в файл file.txt после третьей, четвертой и пятой строк

Вставка cодержимого файла file2.txt в файл file.txt после строки, содержащей рег.выражение

 

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

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

Удаление 2 последних строк файла

Удаление 10 последних строк файла

Или

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

Удаление 2,3,4 строк

Удаление всех строк начиная с 3-й строки и до конца файла

Удаление строк совпадающие с регулярным выражением

Удаление строк НЕ совпадающих с регулярным выражением

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

Удаление строки с первым совпадением шаблона

Удаление всех строк, начиная с 11й, до строки, содержащей слово «mykeyword «. Если строк с «mykeyword» несколько, то удаляет до первой из них.

Удаление всех пробелов/символов табуляции в начале каждой строки файла

Удаление всех пробелов/символов табуляции в конце каждой строки файла

Удаление пробелов/символов табуляции в начале и в конце каждой строки файла

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

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

Или

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

Или

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

Или

Удаление пустых строк с любым кол-вом пробелов в этих строках

Удаление первого символа пробела во всех строках

Удаление первого символа пробела в первой строке

 

Выборочный вывод/печать определенных строк

Вывод первых десяти строк файла file.txt (аналог команды head)

Вывод первой строки файла file.txt (аналог команды head -1)

Вывод последних десяти строк файла file.txt (аналог команды tail)

Вывод последних двух строк файла file.txt (аналог команды tail -n 2)

Вывод последней строки файла file.txt (аналог команды tail -1)

Или

Вывод только дубликатов строк

Вывод второй строки

Или

Или

Вывод строк со второй по четвертую

Или

Вывод всех нечетных строк

Вывод всех четных строк

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

Или

Вывод строк,которые НЕ содержат регулярное выражение (аналог команды grep -v)

Или

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

Вывод строк начиная со строки, которая содержит регулярное выражение и до конца файла

Вывод строк между двумя рег.выражениями

Вывод строки содержащей рег.выражение и следующих за этой строкой трех строк

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

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

Вывод по одной строке перед и после регулярного выражения, с
указанием номера строки совпадающей с регулярным выражением (аналог команды grep -A1 -B1):

Вывод строк, совпадающих с регулярными выражениями AAA, BBB и CCC
одновременно (в любой последовательности):

Вывод строк, совпадающих с регулярными выражениями AAA, BBB и CCC
одновременно (в конкретной последовательности):

Вывод строк, совпадающих с любым регулярным выражением AAA или BBB, или CCC (аналог команды egrep ):

Или

Или

Вывод количества строк (аналог команды wc -l)

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

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

Вывод номеров строк

Вывод номеров строк в файле file.txt. Используя отступ (tab) вместо пустой строки:

Выравнивание текста по правому краю шириной в 79 символов (устанавливает как 78 плюс 1 пробельный символ)

Выравнивание текста по центру

Вывод строк длиной равной или большей 5 символов:

Вывод строк длиной меньше5 символов:

Или

Вывод измененных строк после замены

Запись измененных строк в файл(между опцией w и именем файла должен быть только один пробел)

 

Поддержка регулярных выражений

 

Стандартные регулярные выражения

Начало строки (^)

Конец строки ($)

Одиночный символ(.)

Набор символов ([])
Достаточно совпадения одного символа из указанного набора символов

Исключающий набор символов ([^])
В исключающем наборе каретка отменяет набор символов в квадратных скобках.

Диапазон символов ([-])
Совпадение с любым символом из диапазона, указанного в квадратных скобках

Ноль или один символ (\?)

Один или более символов (\+)

Ноль или больше символов (*)

Точно N символов {n}

Не меньше N символов {n,}

Не меньше M и не больше N {m, n}

Поток – pipe (|)
Символ | в SED означает логический оператор ИЛИ

Экранирование специальных символов

Экранирвание символа обратного слеша \

Экранирование символа новой строки \n

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

 

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

Включает буквы и цифры

Включает только буквы

Включает только цифры

Включает пустые символы – как пробелы, так и символы табуляции

Команда cat -vte используется, чтобы показать символ табуляции

Включает только строчные буквы

Включает только буквы в верхнем регистре

Включает знаки препинания

Включает пробелы


Использование SED в качестве замены других команд

Просмотр содержимого файла (аналог команды cat)

Обратный порядок строк(аналог команды tac)

Или

Обратный порядок символов в каждой строке (аналог команды rev)

Удаление дубликатов последовательных строк в файле(аналог команды uniq) Первая строка в наборе дубликатах строк удерживается от удаления

Отображение символа конца строки($)(аналог команды cat -E)

Отображение символа конца строки($) и символа табуляции (^I)(аналог команды cat -ET)

Копирование файла (аналог команды cp)

Вывод данных, как на стандартный поток вывода, так и в файл (аналог команды tee)

 

Другие полезные команды использования SED

Удалить первую строку с файлов,указанных в файле /root/2.txt

Добавить первую строку в файлы, указанные в файле /root/2.txt

Замена http на https по всему SQL-дампу

Добавить содержимое файла /root/spam.txt во все файлы,указаные в файле /root/2.txt после
строки,которая содержит код Set Referrer Spam as spambot

Добавление символа комментария(#) в начало каждой строке, в которой найдено вхождение/паттерн $CURL в файле file.txt

Удаление расширения файлов(.conf)

Замена расширения файла

Замена oldtext на newtext во всех файлах с именами, которые заканчиваются на .txt

Найти каждую строку в файле, содержащую ШАБЛОН и заменить каждую такую найденную строку, другой строкой — ЗАМЕНЯЮЩАЯ_СТРОКА
Чтобы заменить целую строку с помощью sed, необходимо в начале и в конце шаблона, по которому мы ищем строки, добавить wildcards (.*).

 

Использование переменных в SED

Можно использовать переменные в SED обрамляя при этом команду sed в двойные кавычки вместо одинарных кавычек.

 

Источник:
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

Комментирование и размещение ссылок запрещено.

Комментарии закрыты.

Яндекс.Метрика