Редактор sed

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

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

sed вызывается следующим образом:

sed options file

Где опции - это указание на то, как редактировать файл и путь к файлe, который необходимо отредактировать.

Модификаторы:

  • g. sed по умолчанию заменяет только первое найденное слово. Модификатор g указывает заменять все найденные совпадения в строке.
  • i. Установить регистронезависимый режим.

Эти примеры покрывают основные задачи, которые часто выполняются с помощью sed.

Заменить текст в файле, сохраняя исходный файл с расширением .bak

sed -i.bak 's/text1/text2/g' filename
или так
cat lost_cdr.sql | sed 's/DEFAULT, 2/DEFAULT, 1/g' > lost_cdr_nas1.sql

Прямая замена текста в файле без сохранения исходного файла

sed -i 's/text1/text2/g' filename

Замена при помощи переменных. Обратите внимание на ключ -i, он указывает изменить данные в файле nginx.conf, если ключ -i убрать sed откроет файл, сделает замену и выведет измененную версию на экран (nginx.conf не будет изменен).

export OLD_IP=12.1.1.1
export NEW_IP=122.33.44.55
sed -i "s/$OLD_IP/$NEW_IP/" /etc/nginx/nginx.conf

Вывести третью строку из файла .bash_history

sed -ne 3p .bash_history
OR
sed -n '3p;3q' .bash_history

Вывести только строки, соответствующие шаблону

sed -n '/pattern/p' filename
Например, отобразить только строки содержание "dieg.dev"
sed -n '/dieg.dev/p' /etc/zabbix/zabbix_agentd.conf

Вывести строки с 5 по 10

sed -n '5,10p' filename

Взять из файла с первой по восьмую строки и из них вывести первые пять

sed -n '1,8p;5q' filename

Вставить строку перед каждой строкой, соответствующей шаблону

sed '/pattern/i\New line' filename

Добавить строку после каждой строки, соответствующей шаблону

sed '/pattern/a\New line' filename

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

sed '/^$/d' filename

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

sed -i.bak '/ *#/d; /^$/d' filename

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

sed '1d' filename

Удалить последнюю строку файла

sed '$d' filename

Удалить строки с 10 по 20

sed '10,20d' filename

Удалить пустые символы в конце каждой строки

sed -e 's/ *$//' filename

Удалить строку "string1" из текста не изменяя всего остального

sed -e 's/string1//g'

Заменить первое вхождение "text1" на "text2" в каждой строке

sed 's/text1/text2/' filename

Заменить все вхождения "text1" на "text2" в каждой строке

sed 's/text1/text2/g' filename

Заменить последовательность из любого количества нулей одним нулём

sed -e 's/0*/0/g' example.txt

Вырезать кусок текста из лог- файла. Лог имеет метки времени. Зная метку начала и конца нужного нам куска лога, мы можем при помощи утилиты grep найти номера строк начала и конца. И при помощи sed вырезать нужный нам кусок лога.

cutlog.sh
#!/bin/sh
 
FILE="path to file"
START=`grep -n '2014-11-29 04:51:23.253790' "$FILE" | cut -f1 -d:`
END=`grep -n '2014-11-29 04:51:23.255933' "$FILE" | cut -f1 -d:`
 
sed -n "$START,$END p" $FILE
PQ VPS сервера в 28+ странах.