sed (от англ. Stream EDitor) — потоковый текстовый редактор (а также язык программирования), применяющий различные предопределённые текстовые преобразования к последовательному потоку текстовых данных
Первоначально был написан как UNIX-утилита Ли Макмэхоном (англ. Lee E. McMahon) из Bell Labs в 1973—74 годах. Сейчас sed доступен фактически для любой операционной системы, поддерживающей работу с командной строкой
^ Соответствует началу строки $ Соответствует концу строки . Соответствует любому единственному символу * Соответствует нулю или более повторений предшествующего символа [ ] Соответствуют одному любому из символов включённых в квадратные скобки s/ Соответствует Заменить
Самые простейшие и полуряные команды:
Замена:
sed -e 's/то-что-заменить/то-чем-заменить/g' входящий-файл > новый-файл
Удалить пустые строки и строки стостоящие из одних пробелов:
sed -e '/^\s*$/d' входящий-файл
Разное:
# удаляем пробелы и табуляции с начала каждой строки
# весь текст выравнивается по левому краю
sed 's/^[ \t]*//'
# удаляем пробелы и табуляции в конце каждой строки
sed 's/[ \t]*$//'
# удалить пробелы и табуляции как в начале так и в конце строки
sed 's/^[ \t]*//;s/[ \t]*$//'
# вставить 5 пробелов в начале каждой строки (смещение страницы)
sed 's/^/ /'
# выравнивание всего текста по правому краю на ширину колонки 79
sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # задаем 78 плюс 1 пробел
# выровнять весь текст по центру, два метода
sed -e :a -e 's/^.\{1,77\}$/ & /;ta' # method 1
sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' # method 2
# замена в каждой строке "foo" на "bar"
sed 's/foo/bar/' # заменяет только первое
# найденное значение в строке
sed 's/foo/bar/4' # заменяет только 4 первых значений в строке
sed 's/foo/bar/g' # заменяет все значения в строке
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # заменяет следующий
# за встреченным
sed 's/\(.*\)foo/\1bar/' # заменяет только последнее "foo"
# заменить "foo" на "bar" ТОЛЬКО для строк, в которых есть "baz"
sed '/baz/s/foo/bar/g'
# заменить "foo" на "bar" КРОМЕ тех строк, в которых есть "baz"
sed '/baz/!s/foo/bar/g'
# заменить "scarlet" или "ruby" или "puce" на "red"
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' # все seds
gsed 's/scarlet\|ruby\|puce/red/g' # GNU sed
# расстановка строк в обратном порядке (эмуляция "tac")
# bug/feature в HHsed v1.5 удаляет еще и все пустые строки
sed '1!G;h;$!d' # метод 1
sed -n '1!G;h;$p' # метод 2
# reverse each character on the line (emulates "rev")
sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
# соединяет пары строк друг с другом (как "paste")
sed '$!N;s/\n/ /'
# если строка заканчивается на backslash (\), присоединить следующую
# строку к ней
sed -e :a -e '/\\$/N; s/\\\n//; ta'
# если строка начинается со знака равенства, добавить ее
# к предыдущей строке и заменить "=" на один пробел
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'
# разделять числа запятыми, заменяет "1234567" на "1,234,567"
gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta' # GNU sed
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' # все seds
# добавить запятые для чисел с десятичной точкой и знаком минуса
gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'
# добавить строку кадые 5 строк (после строк 5, 10, 15, 20, и тд.)
gsed '0~5G' # GNU sed
sed 'n;n;n;n;G;' # все seds
Новые версии sed поддерживают редактирование входящего файла, к регулярке надо просто добавить команду -i:
sed -i 's/foo/bar/g' /path/to/my/file