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*