Skip to content


Штучки с sed-ом

sed – это stream editor. Часто используется в скриптах для различных преобразований текста. Ниже приведено несколько типичных примеров.

  1. Удаление из файла заданных строк.
    Пусть, например, нужно удалить строки из файла, в которых содержиться подстрока «phone: xxx-xx-xx» (вместо символа x – цифры):

    1. sed "/phone: [0-9]\{3\}-[0-9]\{2\}-[0-9]\{2\}/ d" somefile.txt

    Здесь между слешами (/) задается шаблон (регулярное выражение), после него стоит оператор «d» (от слова delete), который удаляет строки, совпадающие с шаблоном. Результат:

    1. $cat test.txt
    2. phone: 111-22-44
    3. phone: 111-22-44
    4. phone: 311-22-d4
    5. phone:  111-22-55
    6.  
    7. $sed "/phone: [0-9]\{3\}-[0-9]\{2\}-[0-9]\{2\}/ d" test.txt
    8. phone: 311-22-d4
    9. phone:  111-22-55

    Если нужно, чтобы изменения происходили сразу в файле, без вывода в stdout, нужно добавить ключ --in-place (-i).

  2. Добавление в файл строки в определённом месте.
    Вставляем мета-тег с указанием кодировки документа перед закрывающим тегом </head> во все файлы с расширением .html в текущей директории:

    1. sed -i '/<\/head>/ i <meta http-equiv="Content-Type" content="text\/html; charset=utf-8">' *.html
    2. sed -i -r "s/\r//g" *.html

    Второй sed нужен чтобы поудалять символ возврата каретки с ASCII-кодом 13 в конце строк, который почему-то появляется в результате работы первого sed-а.

  3. Удаление из файла первых нескольких строк до тех пор, пока не встретиться пустая строка. Такое часто бывает нужно при обработке писем – если нужно отделить заголовок письма от его тела:
    1. $cat test.txt
    2. Some text in mail header.
    3. Another text line in mail header.
    4. And so on…
    5.  
    6. Here starts mail body.
    7. Some text in mail body.
    8. Use sed to make things nice :)
    9.  
    10. $sed '1,/^$/ d' test.txt
    11. Here starts mail body.
    12. Some text in mail body.
    13. Use sed to make things nice :)

    Здесь видно, что первые три строки были удалены. Шаблон /^$/ означает пустую строку (символ ^ совпадает с началом строки, а символ $ – с концом строки. Так как между ними ничего нет, то строка пустая). Выражение 1,/^$/ означает диапазон строк с 1-ой до пустой включительно. Оператор «d» – удаление.

  4. Замена текста. Для этого испольузется оператор s///:
    1. $cat test.txt
    2. I want to have nice house with 4 rooms.
    3.  
    4. $sed "s/\(nice\)/very \1/" test.txt | sed "s/[0-9]/12/"
    5. I want to have very nice house with 12 rooms.

    В операторе замены s/// между 1-ым и 2-ым слешем указывается шаблон, который нужно найти для замены, а между 2-ым и 3-им слешем – текст, НА который нужно заменить шаблон. Если в шаблоне используются круглые скобки (их нужно экранировать обратнымы слешами), то текст между скобками будет доступен для использвания во второй части оператора (это называется backreference). Для вставки текста, заключенного в 1-ую пару скобок, применяется конструкция \1, для текста между второй парой скобок – \2 и т.д.

Похожие заметки:

  1. Детальное логирование в Samba
  2. Строим NAT средствами FreeBSD
  3. Ошибка Samba: Unable to connect to CUPS server
  4. Организация уведомлений о событиях

Размещено в категории  *nix, Howto. Теги: .

Комментариев: 0

Чтобы быть всегда в курсе здесь происходящего, Вы можете подписаться на RSS feed для комментариев на эту заметку.

Some HTML is OK

(required)

(required, but never shared)

, или ответить через trackback.