Вы также можете использовать это незначительное изменение, чтобы заставить работать вашу исходную команду sed.
sed '/^this:/ { :k ; n ; // b k ; N ; N ; N ; d }' input_file
Используется al oop, который печатает текущую строку и читает следующую (n
), пока она продолжает сопоставлять регулярное выражение (пустое регулярное выражение //
напоминает последнее оцененное, то есть /^this:/
, а команда b k
возвращается к метке k
в совпадении). Затем вы можете добавить следующие 3 строки и удалить все пространство шаблона, как вы это сделали.
Другая возможность, более краткая, с использованием GNU sed, может быть такой.
sed '/^this:/ b ; /^/,$ { //,+3 d }' input_file
Эта распечатывает любую строка, начинающаяся с this:
(b
без метки, переходит непосредственно к следующему циклу строки после действия печати по умолчанию).
На первой строке не соответствует this:
, две вложенные диапазоны срабатывания. Внешний диапазон "один выстрел". Он срабатывает сразу из-за /^/
, который соответствует любой строке, затем он остается активным до последней строки ($
). Внутренний диапазон является диапазоном переключения. Он также запускается сразу же, потому что //
вызывает /^/
в этой строке (и только в этой строке, следовательно, в одном диапазоне), затем он остается активированным для 3 дополнительных строк (конечный адрес +3
является GNU расширение). После этого /^/
больше не оценивается, поэтому внутренний диапазон не может сработать снова, потому что //
вызывает /^this:/
(что является ранним сокращением).