Подставка Sed с 3 линиями раздвижных окон

Мне нужно реализовать трехстрочное скользящее окно с Sed, чтобы изменить любое возникновение трех следующих сгруппированных строк в большом текстовом файле:

Fax: 05.11.22.33.44<LF> <LF> <LF> 

с этим :

 Fax: 05.11.22.33.44<LF> ### <LF> 

Я попытался сделать это со следующей командной строкой (sed работает в пакетном файле msdos, но он не работает также под моим Linux-bash):

 sed -i ":a;$!N;s/\nFax: \([ 0-9\.]*\n\n\);tenough;$!ba;:enough/\nFax: \1###\n/;$!ba;P;D" file.txt 

Что не так ?

  • sed - выполнить несколько подстановок на строке, найденной путем поиска по шаблону?
  • (In) формальные (и более доступные для поиска) мнемоники для стандартных команд `sed`?
  • Можно ли передавать аргументы в сценарий sed?
  • Проблема декодирования вывода регулярного выражения {m, n} в sed
  • Как добавить новую строку после «test message1» с помощью sed?
  • Как заменить левую скобку на sed?
  • Как использовать Sed для замены всех символов перед двоеточием?
  • Две команды sed в одной команде
  • 2 Solutions collect form web for “Подставка Sed с 3 линиями раздвижных окон”

    Вы получили часть P;D Остальное – неудачная попытка потянуть линии в пространстве шаблонов, пока замена не будет успешной, что не обязательно плохо, но определенно не скользящее окно.
    Вы должны вытащить одну строку, если на первой строке, затем используйте цикл N;P;D (таким образом, у вас всегда есть три строки в пространстве шаблонов) и пытайтесь заменить каждый раз, когда вы тянете новую строку

     sed '1N;$!N;s/\(PATTERN\n\)\(\n\)$/\1###\2/;P;D' infile 

    Я думаю, что это близко к вашей первоначальной попытке реализации:

     sed ':a; $q; N; s/\(Fax:.*\n\)\n$/\1###\n/; 3,${P;D}; ba' 

    Ex.

     $ sed ':a; $q; N; s/\(Fax:.*\n\)\n$/\1###\n/; 3,${P;D}; ba' input > output $ diff -y input output Fax: 05.11.22.33.44 Fax: 05.11.22.33.44 Fax: 05.11.22.33.44 Fax: 05.11.22.33.44 Fax: 05.11.22.33.44 Fax: 05.11.22.33.44 | ### Fax: 05.11.22.33.44 Fax: 05.11.22.33.44 Fax: 05.11.22.33.44 Fax: 05.11.22.33.44 | ### Fax: 05.11.22.33.44 Fax: 05.11.22.33.44 

    Трюк – это 3,${P;D} , это то, что поддерживает 3-строчное окно (путем выталкивания одной строки из пространства шаблонов каждый раз вокруг цикла, но только после того, как количество строк достигает 3).

    Linux и Unix - лучшая ОС в мире.