AllInfo
Main: Info Blog Temp Mail


unix 2015-09-06 09-50-45

Примеры использования sed

Синтаксис команды Описание

sed 's/Nick/John/g' report.txt

Заменяет каждое вхождение Nick на John в файле report.txt

sed 's/Nick|nick/John/g' report.txt

Заменяет каждое вхождение Nick или nick на John.

sed 's/^/ /' file.txt >file_new.txt

Добавляет 8 пробелов слева от текста для улучшения качества печати.

sed -n '/Of course/,/attention you \
pay/p' myfile

Выводит один абзац, начинающийся с "Of course" и заканчивающийся на "attention you pay"

sed -n 12,18p file.txt

Выводит только строки 12-18 файла file.txt

sed 12,18d file.txt

Выводит весь файл file.txt за исключением строк с 12 по 18

sed G file.txt

Удваивает пробелы в file.txt

sed -f script.sed file.txt

Записывает все команды в script.sed и выполняет их.

sed '5!s/ham/cheese/' file.txt

Заменяет ham на cheese в file.txt за исключением 5-й строки

sed '$d' file.txt

Удаляет последнюю строку

sed '/[0-9]\{3\}/p' file.txt

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

sed '/boom/!s/aaa/bb/' file.txt

Если найден "boom", заменить aaa на bb

sed '17,/disk/d' file.txt

Удаляет все строки, начиная с 17-й, до "disk"

echo ONE TWO | sed "s/one/unos/I"

Заменяет one на unos независимо от регистра, поэтому будет напечатано "unos TWO"

sed 'G;G' file.txt

Утраивает пробелы в файле

sed 's/.$//' file.txt

Способ замены dos2unix :)

sed 's/^[ ^t]*//' file.txt

Удаляет все пробелы перед каждой строкой в file.txt

sed 's/[ ^t]*$//' file.txt

Удаляет все пробелы в конце каждой строки в file.txt

sed 's/^[ ^t]*//;s/[ ^]*$//' file.txt

Удаляет все пробелы в начале и в конце каждой строки в file.txt

sed 's/foo/bar/' file.txt

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

sed 's/foo/bar/4' file.txt

Заменяет foo на bar только в четвертом вхождении в строке.

sed 's/foo/bar/g' file.txt

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

sed '/baz/s/foo/bar/g' file.txt

Заменить foo на bar только если строка содержит baz.

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

Удалить все последовательные пустые строки за исключением EOF

sed '/^$/N;/\n$/D' file.txt

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

sed '/./,$!d' file.txt

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

sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' \
file.txt

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

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

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

sed '/regex/,+5/expr/'

Соответствует regex плюс 5 следующих строк

sed '1~3d' file.txt

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

sed -n '2~5p' file.txt

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

sed 's/[Nn]ick/John/g' report.txt

Другой способ записи некоторых приведенных выше примеров. Вы можете предложить свой?

sed -n '/RE/{p;q;}' file.txt

Печатает только первое соответствие RE (регулярного выражения)

sed '0,/RE/{//d;}' file.txt

Удаляет только первое соответствие

sed '0,/RE/s//to_that/' file.txt

Изменяет только первое соответствие

sed 's/^[^,]*,/9999,/' file.csv

Заменяет первое поле на 9999 в CSV-файле

s/^ *\(.*[^ ]\) *$/|\1|/;
s/" *, */"|/g;
: loop
s/| *\([^",|][^,|]*\) *, */|\1|/g;
s/| *, */|\1|/g;
t loop
s/ *|/|/g;
s/| */|/g;
s/^|\(.*\)|$/\1/;

Скрипт sed для конвертирования CSV-файла в файл с вертикальной чертой в качестве разделителя (работает только с некоторыми типами CSV, со встроенными кавычками и запятыми).

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

Меняет формат чисел в file.txt с 1234.56 на 1.234.56

sed -r "s/\<(reg|exp)[a-z]+/\U&/g"

Переводит любое слово, начинающееся с reg или exp в верхний регистр.

sed '1,20 s/Johnson/White/g' file.txt

Производит замену Johnson на White только в строках 1 - 20.

sed '1,20 !s/Johnson/White/g' file.txt

Предыдущий пример наоборот (заменяет везде, кроме строк 1-20)

sed '/from/,/until/ { s/\/magenta/g; \
s/\/cyan/g; }' file.txt

Заменяет только между "from" и "until"

sed '/ENDNOTES:/,$ { s/Schaff/Herzog/g; \
s/Kraft/Ebbing/g; }' file.txt

Заменяет только со слова "ENDNOTES:" и до EOF

sed '/./{H;$!d;};x;/regex/!d' file.txt

Печатает абзац только если он содержит regex

sed -e '/./{H;$!d;}' -e 'x;/RE1/!d;\
/RE2/!d;/RE3/!d' file.txt

Печатает абзацы только если они содержат RE1, RE2 и RE3

sed 's/14"/fourteen inches/g' file.txt

Так вы сможете использовать двойные кавычки

sed 's/\/some\/UNIX\/path/\/a\/new\\
/path/g' file.txt

Работа с путями Unix

sed 's/[a-g]//g' file.txt

Удаляет все символы, начиная с a и заканчивая g из файла file.txt

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

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

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

Замена команды tac

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

Замена команды rev

sed 10q file.txt

Замена команды head

sed -e :a -e '$q;N;11,$D;ba' \
file.txt

Замена команды tail

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

Замена команды uniq

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

Обратная команда (что эквивалентно uniq -d)

sed '$!N;$!D' file.txt

Эквивалент tail -n 2

sed -n '$p' file.txt

... tail -n 1 (или tail -1)

sed '/regexp/!d' file.txt

Эквивалент grep

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

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

sed -n '/regexp/{n;p;}' file.txt

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

sed '/pattern/d' file.txt

Удаляет строки, соответствующие шаблону pattern

sed '/./!d' file.txt

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

sed '/^$/N;/\n$/N;//D' file.txt

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

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

Удаляет последнюю строку каждого абзаца

sed '/^$/q'

Получает заголовок письма

sed '1,/^$/d'

Получает тело письма

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

Получает тему письма

sed 's/^/> /'

Цитирует сообщение, вставляя "> " перед каждой строкой

sed 's/^> //'

Обратная команда (убирает цитирование из сообщения)

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


Удаляет HTML-теги

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

Сортирует абзацы в file.txt в алфавитном порядке

sed 's@/usr/bin@&/local@g' path.txt

Заменяет /usr/bin на /usr/bin/local в path.txt

sed 's@^.*$@<<<&>>>@g' path.txt

Попробуйте и увидите :)

sed 's/\(\/[^:]*\).*/\1/g' path.txt

При условии, что path.txt содержит $PATH, выводит только первый путь в каждой строке

sed 's/\([^:]*\).*/\1/' /etc/passwd

Замена awk - показывает только пользователей из файла passwd

echo "Welcome To The Geek Stuff" | sed \
's/\(\b[A-Z]\)/\(\1\)/g'
(W)elcome (T)o (T)he (G)eek (S)tuff

Понятно без объяснений

sed -e '/^$/,/^END/s/hills/\
mountains/g' file.txt

Заменяет "hills" на "mountains", но только в блоках текста, начинающихся с пустой строки и заканчивающихся строкой с тремя символами "END", включительно.

sed -e '/^#/d' /etc/services | more

Показывает файл services без закомментированных строк

sed '$s@\([^:]*\):\([^:]*\):\([^:]*\
\)@\3:\2:\1@g' path.txt

Меняет порядок элементов в последней строке файла path.txt на обратный

sed '/regex/{x;p;x;}' file.txt

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

sed '/AAA/!d; /BBB/!d; /CCC/!d' file.txt

Ищет соответствие AAA, BBB и CCC в любом порядке

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

Ищет соответствие AAA, BBB и CCC в заданном порядке

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

Печатает строки длиной 65 символов и более

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

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

sed '/regex/G' file.txt

Вставляет пустую строку под каждой строкой

sed '/regex/{x;p;x;G;}' file.txt

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

sed = file.txt | sed 'N;s/\n/\t/'

Нумерует строки в file.txt

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

Выровнять текст по правому краю

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

Выровнять текст по центру

3.16.49.213 / 2024-12-22_20-34-46 UTC.