Você pode usar awk
para isso, assim eu acredito:
awk -vN=3 '/PATTERN/ {skips[FNR+N]=1;} {if(!(FNR in skips)) print;}' <file>
para que, sempre que atingirmos PATTERN
, registremos a linha que é N
daqui e só imprimamos as linhas que não marcamos para pular.
com o gawk você pode usar -i inplace
para fazer isso no lugar
Como você observou, isso não lida com vários arquivos. É claro, você pode agrupar com um loop for
para iterar todos os arquivos, mas se não houver tempo suficiente para tornar a linha de comando muito longa, você também poderá fazer isso:
awk -vN=3 '{if(FNR==1) split("", skips, ":");} /PATTERN/ {skips[FNR+N]=1;} {if(!(FNR in skips)) print;}' *
onde redefinimos skips
para uma matriz vazia sempre que FNR
atinge 1, portanto, o início de cada arquivo.
Com gnu awk
você poderia escrever como:
gawk -i inplace 'FNR==1{delete nr};/PATTERN/{nr[FNR+3]++};!(FNR in nr)' file*