zaLinux.ru

Примеры команды Sed


Полезные однострочные скрипты для sed (потокового редактора Unix), составленные Эриком Пементом

Источник: https://n0where.net/sed-command-examples/

Есть несколько программ, которые являются настоящими рабочими лошадками в обойме UNIX. Эти программы просты в использовании для простых действий, хотя они имеют богатый набор команд для выполнения комплексных действий. Не нужно пренебрегать изучением потенциала программ, ведь очень часто получается, что кто-то пишет свою функцию или подпрограмму, а, оказывается, всё уже давно написано, что уже есть программа, которая делает это в одну строку, но нужно знать эту программу, знать с какими ключами её запустить.

Sed — это первичный потоковый редактор.

Потоковый редактор sed — это текстовый редактор, которые выполняет операции редактирования информации поступающей из стандартного ввода или из файла. Это означает, что вы можете отправлять вывод другой команды прямо на sed для редактирования, или вы можете работать с файлом, который вы уже создали. Также важно помнить, что по умолчанию sed всё выводит также в стандартный вывод. Это означает, что если не сделан редирект, sed будет печатать вывод на экран, вместо того, чтобы сохранить в файл.

Sed редактирует построчно и в неинтерактивном режиме.

Базовое использование:

sed [опции] команды [файл-для-редактирования]

Переводы строк в файле:

Удвоение перевода строк:

sed G

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

sed '/^$/d;G'

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

sed 'G;G'

Отмена удвоения строк (предполагается, что чётные строки всегда пустые)

sed 'n;d'

Вставить пустую строку над каждой строкой, которая соответствует “regex”

sed '/regex/{x;p;x;}'

Вставить пустую строку под каждой строкой, которая соответствует “regex”

sed '/regex/G'

Вставить пустую строку над и под каждой строкой, которая соответствует “regex”

sed '/regex/{x;p;x;G;}'

Нумерация:

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

sed = filename | sed 'N;s/\n/\t/'

Пронумеровать каждую строку в файле (номера слева, выравнивание по правому краю)

sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'

Пронумеровать каждую строку файла, но печатать номер только если строка не пустая

sed '/./=' filename | sed '/./N; s/\n/ /'

Посчитать строки (эмулирует “wc -l”)

sed -n '$=' filename

Преобразования текста и подстановки:

В окружении UNIX: конвертируем новые строки DOS (CR/LF) в формат Unix.

Предполагаем, что все строки оканчиваются на CR/LF

sed 's/.$//'

В bash/tcsh, нажмите Ctrl-V затем Ctrl-M

sed 's/^M$//'

Работает на ssed, gsed 3.02.80 или выше


sed 's/\x0D$//'

В окружении UNIX: конвертируем новые строки Unix (LF) в формат DOS.

Командная строка под ksh

sed "s/$/`echo -e \\\r`/"

Командная строка под bash

sed 's/$'"/`echo \\\r`/"

Командная строка под zsh

sed "s/$/`echo \\\r`/"

gsed 3.02.80 или выше

sed 's/$/\r/'

В окружении DOS: конвертируем новые строки Unix (LF) в формат DOS.

Метод 1

sed "s/$//"

Метод 2

sed -n p

В окружении DOS: конвертировать DOS переводы строк (CR/LF) в формат Unix.

Может быть только сделано с UnxUtils sed, версии 4.0.7 или выше. Версию UnxUtils можно узнать пользовательским свичем “–text”, который появляется когда вы используете свич “–help”. В других случаях изменение перевода строк DOS в перевод строк Unix не может быть выполнено в окружении DOS. Используйте вместо этого “tr”.

UnxUtils sed v4.0.7 или выше

sed "s/\r//" infile >outfile

GNU tr версия 1.22 или выше


tr -d \r <infile >outfile

Удалить пустоту в начале (пробелы, табуляции) от передней части каждой строки выравнивает весь текст по левому краю

sed 's/^[ \t]*//'

Удаление пустоты (пробелы, табуляции) в конце каждой строки

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

sed 's/^[ \t]*//;s/[ \t]*$//'

Вставка 5 пробелов в начале каждой строки (сделать отступ страницы)

sed 's/^/ /'

Выравнять весь текст заподлицо справа на 79-ом столбце по ширине

sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # установить в 78 плюс 1 пробел

Центрировать весь текст в середине на 79-ом столбце по ширине

В первом методе пробелы в начале строки имеют значение, и в конце строки добавляются пробелы.

sed -e :a -e 's/^.\{1,77\}$/ & /;ta'

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

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

Подстановка (поиск и замена “foo” на “bar” в каждой строке

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

sed 's/foo/bar/'

Заменить только четвёртое вхождение в строке

sed 's/foo/bar/4'

Заменить ВСЕ вхождения в строке

sed 's/foo/bar/g'

Заменяет следующее-на-последнее вхождение (the next-to-last case)

sed 's/\(.*\)foo\(.*foo\)/\1bar\2/'

Поменять только последний случай

sed 's/\(.*\)foo/\1bar/'

Поменять “foo” на “bar” ТОЛЬКО для строк, которые содержат “baz”

sed '/baz/s/foo/bar/g'

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

sed '/baz/!s/foo/bar/g'

Поменять “scarlet” или “ruby” или “puce” на “red”

Большинство sed

sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'

Только GNU sed

gsed 's/scarlet\|ruby\|puce/red/g'

Обратный порядок строк (эмулирует “tac”) баг/фича в HHsed v1.5 приводит к тому, что пустые строки удаляются


Метод первый

sed '1!G;h;$!d'

Метод второй

sed -n '1!G;h;$p'

Обратный порядок всех символов в строке (эмулирует “rev”)

sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

Соединить пары строк (наподобие “paste”)

sed '$!N;s/\n/ /'

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

sed -e :a -e '/\\$/N; s/\\\n//; ta'

Если строка начинается со знака равно, прикрепить её к предыдущей строке и заменить “=” на пробел

sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'

Добавить запятые в цифровую строку, замена “1234567” на “1,234,567”

GNU sed

gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta'

Другие seds

sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'

Добавить запятые к номерам, в том числе содержащим десятичные точки и знаки минус (GNU sed)

gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'

Добавить пустую строку каждые 5 строк (после каждых 5, 10, 15, 20 и т. д. строк)

Только GNU sed

gsed '0~5G'

Другие sed

sed 'n;n;n;n;G;'

Выборочная печать конкретных строк:

Напечатать первые 10 строк файла (эмулирует поведение “head”)

sed 10q

Напечатать первую строку файла (эмулирует “head -1″)

sed q

Напечатать последние 10 строк файла (эмулирует “tail”)

sed -e :a -e '$q;N;11,$D;ba'

Напечатать последние 2 строки файла (эмулирует “tail -2″)

sed '$!N;$!D'

Напечатать последнюю строку файла (эмулирует “tail -1″)

Первый метод

sed '$!d'

Второй метод


sed -n '$p'

Напечатать строки файла начиная с последней

Для файла в одну строку напечатать пустую строку

sed -e '$!{h;d;}' -e x

Для файла в одну строку, напечатать эту строку:

sed -e '1{$q;}' -e '$!{h;d;}' -e x

Для файла в одну строку ничего не печатать

sed -e '1{$d;}' -e '$!{h;d;}' -e x

Печатать только строки, которые соответствуют регулярному выражению (эмулирует “grep”)

Метод 1

sed -n '/regexp/p'

Метод 2

sed '/regexp/!d'

Печатать только строки, которые НЕ соответствуют регулярному выражению (эмулирует “grep -v”)

Метод 1, соответствует вышеприведённому

sed -n '/regexp/!p'

Метод 2, упрощённый синтаксис

sed '/regexp/d'

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

sed -n '/regexp/{g;1!p;};h'

Печатать строку, которая идёт сразу после регулярного выражения, но не строку, содержащую регулярное выражение

sed -n '/regexp/{n;p;}'

Печатать по одной строке перед и после регулярного выражения, с номером строки, показывающей где встретилось регулярное выражение (наподобии “grep -A1 -B1″)

sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h

grep для AAA и BBB и CCC (в любом порядке)

sed '/AAA/!d; /BBB/!d; /CCC/!d'

grep для AAA и BBB и CCC (в таком порядке)

sed '/AAA.*BBB.*CCC/!d'

grep для AAA или BBB или CCC (эмулирует “egrep”)

Большинство sed

sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d

Только GNU sed

gsed '/AAA\|BBB\|CCC/!d'

Напечатать параграф, если он содержит AAA (параграфы разделяют пустые строки) HHsed v1.5 должен вставить ‘G;’ после ‘x;’ в следующих трёх скриптах ниже

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'

Напечатать параграф, если он содержит AAA и BBB и CCC (в любом порядке)

sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

Напечатать параграф, если он содержит AAA или BBB или CCC

sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d

Только GNU sed

gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d'

Напечатать только строки длинной 65 символов или длиннее

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

Напечатать только строки, которые короче 65 символов

Метод 1, соответствует вышеприведённому

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

Метод 2, упрощённый синтаксис

sed '/^.\{65\}/d'

Напечатать секцию файла от регулярного выражения до конца файла

sed -n '/regexp/,$p'

Напечатать секцию файла, включающую номера строк (строки 8-12, включая и 8 и 12)

Метод 1

sed -n '8,12p'

Метод 2

sed '8,12!d'

Напечатать строку с номером 52

Способ 1

sed -n '52p'

Способ 2

sed '52!d'

Способ 3, эффективен на больших файлах

sed '52q;d'

Начиная со строки 3, печатать каждую седьмую строку

Только GNU sed

gsed -n '3~7p'

Другие sed

sed -n '3,${p;n;n;n;n;n;n;}'

Напечатать раздел файла между двумя регулярными выражениями (включая)

sed -n '/Iowa/,/Montana/p' # чувствительно к регистру

Выборочное удаление конкретных строк:

Напечатать весь файл КРОМЕ секции между двумя регулярными выражениями 2

sed '/Iowa/,/Montana/d'

Удалить дубликаты последовательных строк файла (эмулирует “uniq”). Первая строка из двух дублирующих сохраняется, остальное удаляется.

sed '$!N; /^\(.*\)\n\1$/!P; D'

Удалить дубликаты непоследовательных строк из файла. Остерегайтесь переполнения буфера или используйте GNU sed.

sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'

Удалить все строки, кроме дублирующих строк (эмулирует “uniq -d”).

sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'

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

sed '1,10d'

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

sed '$d'

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

sed 'N;$!P;$!D;$d'

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

Способ 1

sed -e :a -e '$d;N;2,10ba' -e 'P;D'

Способ 2

sed -n -e :a -e '1,10!{P;N;D;};N;ba'

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

Только GNU sed

gsed '0~8d'

Другие sed

sed 'n;n;n;n;n;n;n;d;'

Удалить строки, содержащие паттерн

sed '/pattern/d'

Удалить ВСЕ пустые строки из файла (то же самое что и “grep ‘.’ “)

Способ 1

sed '/^$/d'

Способ 2

sed '/./!d'

Удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла, кроме первой, также удаляет все пустые строки в начале и в конце файла (эмулирует “cat -s”)

Способ 1, позволяет 0 пустых строк вверху, 1 в EOF

sed '/./,/^$/!d'

Способ 2, позволяет 1 пустую строку вверху, 0 в EOF

sed '/^$/N;/\n$/D'

Удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла кроме первых двух:

sed '/^$/N;/\n$/N;//D'

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

sed '/./,$!d'

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

sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' # works on all seds

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

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

Специальные приложения:

Удалить оверстрайки nroff (char, backspace) из страниц man. Команде ‘echo’ может понадобиться переключатель -e если вы используете Unix System V или шелл bash.

Требуются двойные кавычки для окружения Unix

sed "s/.`echo \\\b`//g"

в bash/tcsh, нажмите Ctrl-V, а затем Ctrl-H

sed 's/.^H//g'

hex выражения для sed 1.5, GNU sed, ssed

sed 's/.\x08//g'

Получить заголовки Usenet/e-mail сообщений

sed '/^$/q' # удаляет всё после первой пустой строки

Получить тело Usenet/e-mail сообщений

sed '1,/^$/d' # удаляет всё до первой пустой строки

Получает Тему из заголовка, но удаляет первоначальное “Subject: ”

sed '/^Subject: */!d; s///;q'

Получает обратный адрес отправителя из заголовка

sed '/^Reply-To:/q; /^From:/h; /./d;g;q'

Разбирает поле адрес. Достаёт чистый e-mail адрес из первой строки, которая включает в себя кусок заголовка (смотрите предыдущий скрипт)

sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'

Добавить ведущую скобку и пробел для каждой строки (цитата сообщения)

sed 's/^/> /'

Удалить ведущую скобку и пробел для каждой строки (расцитативание)

sed 's/^> //'

Удаление большинства HTML тэгов (включая многострочные тэги)

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

Извлечение нескольких частей двоичных файлов, представленных методом UUE, удаление посторонних данных заголовка так, что остаётся только закодированные в UUE данные. Фалы, передаваемые sed, должны быть переданы в правильном порядке. Версия 1 может быть введена в командную строку; версия 2 может быть исполнена в скрипте оболочки Unix

Версия 1

sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode

Версия 2

sed '/^end/,/^begin/d' "$@" | uudecode

Отсортировать параграфы файла в алфавитном порядке. Параграфы разделяются пустой строкой. GNU sed использует \v для вертикального таба, или может применяться любой другой уникальный символ.

sed '/./{H;d;};x;s/\n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}=/\n/g'
gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/'

Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *