Вы можете использовать awk
для этого, я думаю, так:
awk -vN=3 '/PATTERN/ {skips[FNR+N]=1;} {if(!(FNR in skips)) print;}' <file>
поэтому каждый раз, когда мы нажимаем ШАБЛОН
, мы записываем строку, которая равна N
отсюда, и вывести только те строки, которые мы не отметили для пропуска.
с gawk вы также можете использовать -i inplace
, чтобы сделать это на месте
Как вы заметили, это не будет обрабатывать несколько файлов. Конечно, вы можете обернуть цикл for
для перебора всех файлов, но если этого недостаточно, чтобы сделать командную строку слишком длинной, вы также можете сделать это так:
awk -vN=3 '{if(FNR==1) split("", skips, ":");} /PATTERN/ {skips[FNR+N]=1;} {if(!(FNR in skips)) print;}' *
где мы сбрасываем пропускает
к пустому массиву каждый раз, когда FNR
достигает 1, то есть начало каждого файла.
С gnu awk
вы можете написать это как:
gawk -i inplace 'FNR==1{delete nr};/PATTERN/{nr[FNR+3]++};!(FNR in nr)' file*