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. Удаление из файла первых нескольких строк до тех пор, пока не встретиться пустая строка. Такое часто бывает нужно при обработке писем – если нужно отделить заголовок письма от его тела:
    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» – удаление.

  3. Замена текста. Для этого испольузется оператор 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. Включение в лог sSMTP даты и времени отправки письма

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

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

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

Some HTML is OK

(required)

(required, but never shared)

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