Сайт | Скачать | Видео | Wiki

Автор Тема: Неинтерактивный текстовый редактор SED  (Прочитано 6229 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Zloy_T

  • Почетный участник
  • Старожил
  • *
  • Сообщений: 326
  • Репутация: +74/-2
1. Назначение и Формат использования
SED - неинтерактивный текстовый редактор, предназначенный для пакетного редактирования файлов. Полезен для:
Редактирования очень больших файлов;
Редактирования файлов любой величины, если последовательность команд редактирования является слишком длинной и сложной и, следовательно, неудобной для выполнения интерактивного редактирования.
Выполнения множества раз одной и той же функции редактирования.

SED копирует строку из input (стандартный или указываемый набор файлов) в PATTERN SPACE (некоторая область), и к этой строке применяет все команды, адреса которых попадают в PATTERN SPACE . Затем PATTERN SPACE копируется в output . (Фактически в PATTERN SPACE находится одна строка, за исключением команды N , см.4. Функции SED )

Формат:

SED [-n] [-e script] [-f sfile] [files]

script - набор команд редактирования SED , который может содержать до 200 команд или до 10000 байт.

sfile - файл со скриптом SED .

files - файлы, предназначенные для SED -редактирования.

-n - указывает, что в output выводятся не все строки, но только те, к которым применялась команда p. (См. 4.Функции SED . и 5.Функция контекстной замены.)

Флаг -e может быть опущен, если он присутствует один.

Команда SED :

[address[,address]] function [arguments]


адрес адрес функция аргументы

2. Адресация в командах SED

С помощью адресации происходит отбор строк для редактирования.

Адрес:
Десятичный номер строки;
$ - последняя строка input ;
Регулярное выражение.

Если адреса не указаны, то команда применяется ко всем pattern space;

Если присутствует один адрес, то команда применяется ко всем тем pattern space, куда попадает этот адрес;

Если указаны два адреса, то они ограничивают область применения команды.


3. Регулярное выражение

Для осуществления отбора строк для редактирования, в адресах команд SED допускается использование регулярных выражений, заключенных в "/ /" и определяемых следующим образом:

Регудярное выражение указывается в разделителях: "/ /" ;
любой символ (кроме специальных: \[.^*$ ) является регулярным выражением себя;
^ в начале регулярного выражения указывает на пустой символ в начале регулярного выражения. (Т.е. на начало строки)
$ в конце регулярного выражения указывает на пустой символ в конце регулярного выражения. (Т.е. на конец строки);
\n - вставленный newline (новая строка);
. - любой символ (кроме обыкновенного newline );
* - стоящая за регулярным выражением означает любую последовательность вхождений этого выражения, начиная с 0;
[ ] - указывает на один из символов, приведенных внутри;
[^ ] - указывает на один из символов, кроме приведенных внутри;
\ - перед любым символом, кроме цифр и "(" , ")" , означает этот символ. ( Экранирование специальных символов).
\(x\) -, где x - регулярное выражение, указывает на x .
\d -, где d - цифра, указывает копию d -того выражения, которое заключалось в скобки "\(" и "\)" ;
конкатенация регулярных выражений является регулярным выражением.

Примеры:

Код
/olga/
- указывает на строки содержащие "olga" , "abcolgadef" ,...;

Код
/ol.*ga/ 
- указывает на строки, содержащие "olga" , "olabcga" ,....;

Код
/^[Oo]lga/
- на строки, начинающиеся с "Olga" или "olga" ;

Код
/./
- попадают все строки, имеющие хотя бы 1 символ (не newline );

Код
/\./ 
- попадают строки, содержащие "." ;

Код
/^[^ ]/
- строки, не начинающиеся с " " ;

Код
/\(ol\).*\1/
- строки, содержащие два вхождения "ol" не подряд.


4. Функции SED

(В скобках указывается максимальное число адресов)

(1) a \text - Добавить "text" после указанной строки (вывести), потом считать следующую.

(2) b label - Перейти на метку, устанавливаемую, с помощью функции ":" , если label пуст, то перейти в конец скрипта.

(2) c \text - Удалить pattern space и вывести "text" на output .

(2) d - Удалить pattern space .

(2) D - Удалить pattern space до вставленной newline .

(2) g - Заместить содержимое pattern space содержимым буфера hold space .

(2) G - Добавить к содержимому pattern space содержимое буфера hold space .

(2) h - Заместить содержимое буфера hold space на содержимое pattern space .

(2) H - Добавить к содержимому буфера hold space содержимое pattern space .

(1) i \text - Вывести текст на output перед указанной строкой.

(2) n - Вывести pattern space на output и считать следующую строку.

(2) N - Добавить следующую строку к pattern space , разделяя строки вставленным newline .

(2) p - Скопировать pattern space на output .

(2) P - Скопировать pattern space до первой вставленной newline на output .

(1) q - Переход на конец input . Вывести указанную строку, (если нет флага -n ) и завершить работу SED .

(2) r rfile - Читать содержимое rfile и вывести его на output прежде чтения следующей строки.

(2) s - Функция контекстной замены. (См. 5.)

(2) t label - Перейти на метку, устанавливаемую с помощью функции ":" , если для этой строки была осуществлена замена с помощью функции "s" . Флаг осуществления замены восстанавливается при чтении следующей строки или при выполнении функции "s" .

(2) w wfile - Добавить pattern space к концу файла wfile . (Максимально можно использовать до 10 открытых файлов.)

(2) x - Поменять местами содержимое pattern space и буфера hold space .

(2) y /str1/str2/ - Заменить все вхождения символов из str1 на соответствующие из str2 . Длины строк должны быть равными.

(2) ! func - Применять функцию func (или группу функций в {} ) к стокам НЕ попадающим в указанные адреса.

(0) : label - Устанавливает метку для перехода по "b" и "t" командам.

(1) = - Выводит номер строки на output как строку.

(2) { - Выполняет функции до "}" , только когда выбрано pattern space . Группировка функций.

(0) - Пустая команда игнорируется.

# - Комментарий.

( "#n" в скрипте равносильно установке флага -n )


5. Функция контекстной замены

Формат:

(2)s/< Регулярное выражение > /< Замена > /< флаги >

Функция s заменяет вхождение < Регулярного выражения > в pattern space на < Замену > .

< Регулярное выражение > : Аналогично выше данному, но может быть заключено не в "/ /" а в любые другие символы (не " " (пробел) и не newline ).

< Замена > : Любой набор символов. Используются специальные символы:

"& " - Заменяется на строку, указанную в регулярном выражении.

"\d" - , где d - цифра, указывает на d -тое выражение, заключенное в "\(","\)" в регулярном выражении.

< Флаги > :

g - Глобальная замена: заменить все вхождения в строке.

p - Печатать (выводить на output ) строки, в которых была осуществлена замена.

w wfile  - Выводить в файл wfile строки, в которых была осуществлена замена.

Примеры:

Код
s/to/by/w changes
- Заменить в тексте первое вхождение "to" в каждой строке, если таковое есть, на "by" и измененные строки сохранить в файле "changes" .

Код
/iiii/s/[Oo]lga/ Olga V.Galina/p
- Заменить в тексте, в строках, где встречается вхождение "iiii" , первое вхождение подстроки "olga" или "Olga" на " Olga V.Galina" , при этом измененные строки выводить на печать.

Код
s/[.,;:?]/*sign& *sign& **/g
- Заменить в тексте каждое вхождение одного из знаков ".,;:?" в строку на "*sign& *" , где & будет тем знаком, который стоял прежде, например, "." на "*sign.*" , "?" на "*sign?*" и т. д.

6. Сравнительное решение задач с помощью SED и AWK
Система UNIX обладает несколькими утилитами, которые обрабатывают входной поток данных и позволяют также решать некоторые задачи редактирования: grep , egrep , fgrep , lex и awk . Мощная и многофункциональная утилита awk также может быть применена для простого редактирования текстов, поскольку также основана на использовании регулярных выражений. Однако, как видно из примеров, приведенных ниже, время решения задач с помощью sed значительно меньше по сравнению со временем, затрачиваемым awk . Неинтерактивный редактор sed обеспечивает выполнение в пакетном режиме большинства функций редактирования редактора ed и является оптимальным при решении несложных задач пакетного редактирования.

Примеры:
1. Посчитать количество строк (input)

Код
SED: $= (10.2 c.) 

AWK: END { PRINT NR } (15.0 c.)


2. Напечатать все строки, содержащие "olga"

Код
SED: /olga/p (11.6 c.) 

AWK: /olga/ (25.6 c.)


3. Напечатать все строки, содержащие "olga", "mike" или "mal"


Код
SED:     /olga/p

         /olga/d

         /mike/p

         /mike/d

         /mal/p

         /mal/d      (15.8 c.)



AWK:     /olga|mike|mal/   (29.9 c.)


4. Напечатать третье поле каждой строки

Код
SED: /[^ ]* [ ]*[^ ]* [ ]*\([^ ]*\).*/s//\1/p (29.0 c.) 

AWK: {PRINT $3} (33.3 c.)


5. Напечатать сначала третье а затем второе поля каждой строки

Код
SED: /[^ ]* [ ]*\([^ ]*\) [ ]*\([^ ]*\).*/s//\2\1/p (30.5 c.) 

AWK: {PRINT $3 $2} (38.9 c.)


6. Добавить стороки, содержащие "olga", "mike" или "mal" соответственно к файлам: folga, fmike, fmal


Код
SED:    /olga/w folga

        /mike/w fmike

        /mal/w fmal          (16.1 c.)



AWK:    /olga/ {print >  "folga"}

        /mike/ {print >  "fmike"}

        /mal/ {print >  "fmal"}   (46.4 c.)

http://www.citforum.ru/operating_systems/articles/tut_6.shtml
« Последнее редактирование: 30 Май 2009, 18:56:59 от Zloy_T »

Оффлайн Zloy_T

  • Почетный участник
  • Старожил
  • *
  • Сообщений: 326
  • Репутация: +74/-2
Одно-строчные скрипты SED

Это перевод статьи http://sed.sourceforge.net/sed1line.txt

Версия 5.5 от 29 Дек. 2005

Составлено: Eric Pement (pemente@northpark.edu)

Переведено: Anton Tarasov aka Ant0 (mailbox@ant0.ru)


Пространство между строками:

Двойное пространство между строками:
Код
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;}'

Нумерация:

Нумерация каждой стоки в файле filename. Используя отступ (tab) (смотрите примечание по '\t' в конце документа) вместо пустой строки:
Код
sed = filename | sed 'N;s/\n/\t/'
Нумерация каждой строки в файле filename (номер слева, выравненый по правому краю):
Код
sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'
Нумерация каждой строки в файле filename, с выводом номера только для не пустых строк:
Код
sed '/./=' filename | sed '/./N; s/\n/ /'
Подсчет строк (эмуляция "wc -l"):
Код
sed -n '$='

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

В UNIX окружении: преобразование окончания строк из формата DOS (CR/LF) в формат Unix (LF):
Код
sed 's/.$//' (подразумевается что все строки заканчиваются с CR/LF)
sed 's/^M$//' (в bash/tcsh, нажмите Ctrl-V затем Ctrl-M)
sed 's/\x0D$//' (работает в ssed, gsed 3.02.80 или выше)
В UNIX окружении: преобразование разрыва строк Unix (LF) в формат DOS:
Код
sed "s/$/`echo -e \\\r`/" (команда в ksh)
sed 's/$'"/`echo \\\r`/" (команда под bash)
sed "s/$/`echo \\\r`/" (команда под zsh)
sed 's/$/\r/' (команда под gsed 3.02.80 или выше)
В DOS окружении: преобразование разрыва строк Unix (LF) в формат DOS:
Код
Версия 1: sed "s/$//"
Версия 2: sed -n p
В DOS окружении: преобразование разрыва строк DOS (CR/LF) в формат Unix. Работоет только с sed версии 4.0.7 или выше. Версию в Unix окружении можно узнать, вызвав SED с параметром "--version". В версии ниже, в DOS окружении такой фокус не пройдет. Использвйте взамен комманду "tr":
Код
sed "s/\r//" infile >outfile (sed v4.0.7 или выше)
tr -d \r <infile >outfile (GNU tr версии 1.22 или выше)
Удалить все пробелы и символы табуляции в начале каждой строки файла (смотрите примечание по табуляции в конце документа):
Код
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 пробельный символ)
Центрировать весь текст посередине столбца шириной 79 символов. В версии 1, пробелы добовляются в начало и конец строки. В версии 2, пробелы добовляются только в начало строки:
Код
Версия 1: sed -e :a -e 's/^.\{1,77\}$/ & /;ta'
Версия 2: sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/'
Поиск и замеHа "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" на "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' (большинство sed-ов)
gsed 's/scarlet\|ruby\|puce/red/g' (только GNU sed)
Перевернуть последовательность строк (эмуляция "tac") (ошибка/особеннось в HHsed v1.5 причина удалению пустой строки):
Код
Версия 1: sed '1!G;h;$!d'
Версия 2: 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":
Код
gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta' (GNU sed)
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' (другие sed-ы)
Добавить запятые к числу с десятичной частью и знаком минуса (GNU sed):
Код
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;' (другие sed-ы)

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

Печатать первые 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"):
Код
Версия 1: sed '$!d'
Версия 2: 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"):
Код
sed -n '/regexp/!p' - Версия 1, corresponds to above
sed '/regexp/d' - Версия 2, simpler syntax
Печатать строку непосредственно перед регулярным выражением, но не печатать строку содержащую регулярное выражение:
Код
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
Печать строк, совпадающих с регулярными выражениями AAA, BBB и CCC одновременно (в любой последовательности):
Код
sed '/AAA/!d; /BBB/!d; /CCC/!d'
Печать строк, совпадающих с регулярными выражениями AAA, BBB и CCC одновременно (в конкретной последовательности):
Код
sed '/AAA.*BBB.*CCC/!d'
Печать строк, совпадающих с любым регулярным выражением AAA или BBB, или CCC (эмуляция "egrep"):
Код
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d (большинство sed'ов)
gsed '/AAA\|BBB\|CCC/!d' (только GNU sed)
Печатать абзац если он содержит AAA (пустая строка разделяет абзацы) (в HHsed v1.5 необходимо вставить 'G;' после 'x;'):
Код
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'
Печатать абзац если он содержит AAA, BBB и CCC (в любой последовательности) (в HHsed v1.5 необходимо вставить 'G;' после 'x;'):
Код
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
Печатать абзац если он содержит AAA или BBB, или CCC (в HHsed v1.5 необходимо вставить 'G;' после 'x;'):
Код
sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d' (только GNU sed)
Печатать строки длиной равной или большей 65 символов:
Код
sed -n '/^.\{65\}/p'
Печатать строки длиной меньше или равной 65 символов:
Код
sed -n '/^.\{65\}/!p' - Версия 1, отвечает условию
sed '/^.\{65\}/d' - Версия 2, более простой синтаксис
Печатать часть файла начиная от совпадения с регулярным выражением и до конца файла:
Код
sed -n '/regexp/,$p'
Печатать часть файла основываясь на номерах строк (строки 8-12, включительно):
Код
Версия 1: sed -n '8,12p'
Версия 2: sed '8,12!d'
Печатать строку под номером 52:
Код
sed -n '52p' - Версия 1
sed '52!d' - Версия 2
sed '52q;d' - Версия 3, эффективен на больших файлах
Начиная с 3ей строки печатать каждую седьмую строку в файле:
Код
gsed -n '3~7p' (только GNU sed)
sed -n '3,${p;n;n;n;n;n;n;}' (другие sed-ы)
Печатать часть файла между двумя регулярными выражениями (включительно):
Код
sed -n '/Iowa/,/Montana/p' (регистро зависимый)

Избирательное удаление определенных строк:

Печатать все линии ИСКЛЮЧАЯ часть между двумя регулярными выражениями:
Код
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'
Удалить каждую восьмую строку в файле:
Код
gsed '0~8d' (только GNU sed)
sed 'n;n;n;n;n;n;n;d;' (другие sed-ы)
Удалить строки совпадающие с регулярным выражением:
Код
sed '/pattern/d'
Удалить ВСЕ пустрые строки из файла (эмуляция "grep '.' "):
Версия 1:
Код
sed '/^$/d'
Версия 2:
Код
sed '/./!d'
Удалить все последовательности пустых строк из файла исключая первую. Также удалить все пустые строки в начале и в конце файла (эмуляция "cat -s"):
Код
sed '/./,/^$/!d' (Версия 1, допускается 0 пустых строк в начале и 1 в конце файла)
sed '/^$/N;/\n$/D' (Версия 2, допускается 1 пустая строка в начале и 0 в конце файла)
Оставить последовательность пустых строк не более двух одновременно:
Код
sed '/^$/N;/\n$/N;//D'
Удалить все пустые строки в начале файла:
Код
sed '/./,$!d'
Удалить все пустые строки в конце файла:
Код
sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' (для всех sed-ов)
sed -e :a -e '/^\n*$/N;/\n$/ba' (для всех, кроме gsed 3.02.*)
Удалить последнюю непустую строку в каждом абзаце:
Код
sed -n '/^$/{p;h;};/./{x;/./p;}'

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

Получить заголовок Usenet/e-mail сообщения:
Код
sed '/^$/q' (удаляет все после первой пустой строки)
Получить тело Usenet/e-mail сообщений:
Код
sed '1,/^$/d' (удаляет все до первой пустой строки)
Получить заголовок Subject (тема Usenet/e-mail сообщения), без удаления части "Subject: ":
Код
sed '/^Subject: */!d; s///;q'
Получить заголовок обратный адрес:
Код
sed '/^Reply-To:/q; /^From:/h; /./d;g;q'
Анализировать правильный исходящий адрес. # Pulls out the e-mail address by itself from the 1-line return address header (see preceding script):
Код
sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'
Добавить скобку и пробел в начало каждой строки (цитирование сообщения):
Код
sed 's/^/> /'
Удалить скобку и пробел в начале каждой строки (unquote a message):
Код
sed 's/^> //'
Удалить большинство HTML тегов (включая теги состоящие из несколько строк):
Код
sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
Извлечение закодированных (uuencoded) двоичных данных из нескольких частей, удаление внешней заголовочной информации. Итак это только часть закодированного остатка. Файлы пропущенные через sed должны быть пропущены в правильной последовательности. Версия 1 может быть введена из командной строки, версия 2 может быть встроена в исполняемый скрипт оболочки Unix. (Модифицированна из скрипта Rahul Dhesi):
Версия 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/'
Удалить конкретный символ (к примеру: символ возврата) из man страницы. Для использования команды 'echo' может потребоваться указать параметр -e (если вы используете Unix System V или оболочку bash):
Код
sed "s/.`echo \\\b`//g" (двойные кавычки необходимы в Unix окружении)
sed 's/.^H//g' (в bash/tcsh, нажмите Ctrl-V и затем Ctrl-H)
sed 's/.\x08//g' (hex выражение для sed 1.5, GNU sed, ssed)
В DOS окружении: создаем коммандный файл, который запаковывает каждый txt-файл в каталоге (в две команды):
Код
echo @echo off >zipup.bat
dir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat

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

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

Так:
Код
cat filename | sed '10q' (используется ввод из конвеера)
sed '10q' filename (тот же эффект, исключая использование "cat")
sed '10q' filename > newfile (перенаправление вывода в файл)

Для дополнительных синтаксических инструкций, включая метод применения команд редактирования из файла, взамен командной строки, посмотрите книги Dale Dougherty и Arnold Robbins "sed & awk, 2nd Edition," (O'Reilly, 1997; http://www.ora.com), "UNIX Text Processing," by Dale Dougherty и Tim O'Reilly (Hayden Books, 1987) или учебники Mike Arst distributed in U-SEDIT2.ZIP (many sites).

Для использование всех возможностей sed-а вы должны понимать "регулярные выражения". Для этого смотрите "Mastering Regular Expressions" by Jeffrey Friedl (O'Reilly, 1997).

Могут пригодиться страницы руководства ("man") в системе Unix (Используйте "man sed", "man regexp", или раздел по регулярным выраженям в "man sed"), но страницы руководства, как правило, трудны. Они не написаны для обучения пользователей использования sed-а или регулярных выражений с нуля, а написаны как справочник для тех кто уже умеет работать с этими инструментами.

Цитирование правил (Quoting syntax):

Предшествующий пример использует одинарные кавычки ('...') вместо двойных кавычек ("...") для окружения редактируемой команды, с тех пор как sed в основном исользуется на платформах Unix. Одинарные кавычки предотращают оболочку Unix от интерпретации знака доллара ($) и обратных кавычек (`...`), которые расширяют оболочку если они заключены в двойные кавычки. Пользователи "csh" shell и происходящие от нее оболочки, также нуждаются в взятие в кавычки знака восклицания (!). С обратной косой чертой (\!) правильно запускает пример указанные выше, даже внутри одинарных кавычек.

Версии sed написанные для DOS обязательно требуют заключение редактируемых команд в двойные кавычки ("...") взамен одинарных.

Использование '\t' в скриптах SED:

Для ясности документации, мы можем использовать выражение '\t' для обозначения символа табуляции (0x09) в скриптах.

Однако большинство версий sed-а не понимают сокращение '\t', чтобы ввести этот символ из командной строки, введите его клавишей "TAB".

'\t' поддерживается как метасимвол регулярнго выражения в awk, perl, HHsed, sedmod, и GNU sed v3.02.80.

Версии sed:

Разные версии sed-а, различаются незначителными переменами. Большинство версий не поддерживает меток (:name) или ветвление инструкций (b,t) внутри команд редактирования. Хотя поддерживают их в конце команд. Желательно использовать синтаксис исключая метки и ветвления инструкций, несмотря на популярность GNU версии sed-а, позволяющий более краткий и красивый синтаксис.

Когда читатель смотрит GNU версию sed-а, поддерживающего боле лаконичный синтаксис и видит такую длинную команду, как эту:
Код
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d

это подбивает к изученю GNU версию sed-а, для укорачивания команды:
Код
sed '/AAA/b;/BBB/b;/CCC/b;d'
sed '/AAA\|BBB\|CCC/b;d'

В дополнение запомните: многие версии sed-а принимают команду, типа "/one/ s/RE1/RE2/", но не принимают типа "/one/! s/RE1/RE2/" - содержащую пробел перед "s".

Оптимизация по скорости:

Для необходимого ускорения выполнения программы (к примеру на больший файлах, медленном процессоре или медленном носителе), замена будет более быстрой если искомое условие будет продублированно перед инструкцией "s/.../.../". Пример:
Код
sed 's/foo/bar/g' filename (стандартная команда замены)
sed '/foo/ s/foo/bar/g' filename (выполняется быстрее)
sed '/foo/ s//bar/g' filename (укороченный синтаксис предыдущей команды)

В однострочном выводе на печать или удалении строк (при неполной обработке файла), используйте команду выхода "quit" (q) в скрипте - это резко сократит время обработки больших файлов. Пример:
Код
sed -n '45,50p' filename (вывести на печатать линии с 45 по 50)
sed -n '51q;45,50p' filename (тоже самое, но работает быстрее)

Если Вы хотите добавить свой скрипт или нашли ошибку в этом документе, пожалуйста отправьте e-mail составителю. Также укажите составителю используемую Вами версию sed-а, операционную систему составителю и обозначьте проблему. Чтобы охарактеризовать скрипт как одно-строковый, команда должна содержать не больше 65 символов.