Просто для удовольствия: это цикл оболочки над интерактивным строковым редактором ed
это решает проблему:
while ed text.in <script.ed >/dev/null; do
: # nothing here
done
Файл script.ed
содержит
/^[^#].*Fail/-2
.,+3s/^/#/
w
Первая строка сценария редактирования находит следующую строку, содержащую слово Fail
, которое еще не было добавлено с #
, и отступает на две строки от этого.
Вторая строка сценария заменяет начало строки на #
(т.е. добавляет #
к строке) для текущей строки и еще трех строк вперед.
Третья строка сценария записывает файл обратно на диск.
Цикл в оболочке завершится, как только ed
завершится с ненулевым статусом выхода. Это произойдет, если он не сможет найти другую строку, соответствующую регулярному выражению, в первой строке скрипта редактирования.
Как вариант, без отдельного скрипта редактирования в файле:
while ed text.in >dev/null <<ED_END
/^[^#].*Fail/-2
.,+3s/^/#/
w
ED_END
do
: # nothing here
done