for f in file1 file2 file...; do
sed -i -f <(grep -n PATTERN "$f" | while IFS=: read line rest; do printf "%dd; " $((line+3)); done) "$f"
done
Чтобы разделить это на части:
Перебрать файл1 файл2 файл ...
создать выражение sed внутри подстановки процесса, чтобы в конечном итоге запустить против файла.
grep
выводит номера строк, соответствующие ШАБЛОНУ в файле (вместе с фактической совпадающей строкой).
Пример вывода:
2:2 PATTERN
3:3 same PATTERN
6:6 another PATTERN
цикл while удаляет номер строки, отбрасывая совпадающую строку, затем отправляя ее в printf с увеличением на 3
printf печатает номер целевой строки, за которым следует sed d
Удалить команду и разделяющую точку с запятой.
Пример вывода (в качестве входных данных для sed
):
5d; 6d; 9d;
Этот метод обеспечивает большую гибкость; вы можете установить N = 3
и использовать $ ((line + N))
в качестве аргумента printf.
Чтобы учесть редактирование на месте, я предполагаю, что sed поддерживает редактирование на месте -i
.