sed – это stream editor. Часто используется в скриптах для различных преобразований текста. Ниже приведено несколько типичных примеров.
- Удаление из файла заданных строк.
Пусть, например, нужно удалить строки из файла, в которых содержиться подстрока «phone: xxx-xx-xx» (вместо символа x – цифры):-
sed "/phone: [0-9]\{3\}-[0-9]\{2\}-[0-9]\{2\}/ d" somefile.txt
Здесь между слешами (/) задается шаблон (регулярное выражение), после него стоит оператор «d» (от слова delete), который удаляет строки, совпадающие с шаблоном. Результат:
-
$cat test.txt
-
phone: 111-22-44
-
phone: 111-22-44
-
phone: 311-22-d4
-
phone: 111-22-55
-
-
$sed "/phone: [0-9]\{3\}-[0-9]\{2\}-[0-9]\{2\}/ d" test.txt
-
phone: 311-22-d4
-
phone: 111-22-55
Если нужно, чтобы изменения происходили сразу в файле, без вывода в stdout, нужно добавить ключ --in-place (-i).
-
- Добавление в файл строки в определённом месте.
Вставляем мета-тег с указанием кодировки документа перед закрывающим тегом </head> во все файлы с расширением .html в текущей директории:-
sed -i '/<\/head>/ i <meta http-equiv="Content-Type" content="text\/html; charset=utf-8">' *.html
-
sed -i -r "s/\r//g" *.html
Второй sed нужен чтобы поудалять символ возврата каретки с ASCII-кодом 13 в конце строк, который почему-то появляется в результате работы первого sed-а.
-
- Удаление из файла первых нескольких строк до тех пор, пока не встретиться пустая строка. Такое часто бывает нужно при обработке писем – если нужно отделить заголовок письма от его тела:
-
$cat test.txt
-
Some text in mail header.
-
Another text line in mail header.
-
And so on…
-
-
Here starts mail body.
-
Some text in mail body.
-
Use sed to make things nice :)
-
-
$sed '1,/^$/ d' test.txt
-
Here starts mail body.
-
Some text in mail body.
-
Use sed to make things nice :)
Здесь видно, что первые три строки были удалены. Шаблон /^$/ означает пустую строку (символ ^ совпадает с началом строки, а символ $ – с концом строки. Так как между ними ничего нет, то строка пустая). Выражение 1,/^$/ означает диапазон строк с 1-ой до пустой включительно. Оператор «d» – удаление.
-
- Замена текста. Для этого испольузется оператор s///:
-
$cat test.txt
-
I want to have nice house with 4 rooms.
-
-
$sed "s/\(nice\)/very \1/" test.txt | sed "s/[0-9]/12/"
-
I want to have very nice house with 12 rooms.
В операторе замены s/// между 1-ым и 2-ым слешем указывается шаблон, который нужно найти для замены, а между 2-ым и 3-им слешем – текст, НА который нужно заменить шаблон. Если в шаблоне используются круглые скобки (их нужно экранировать обратнымы слешами), то текст между скобками будет доступен для использвания во второй части оператора (это называется backreference). Для вставки текста, заключенного в 1-ую пару скобок, применяется конструкция \1, для текста между второй парой скобок – \2 и т.д.
-
Комментариев: 0
Чтобы быть всегда в курсе здесь происходящего, Вы можете подписаться на RSS feed для комментариев на эту заметку.