Uma solução ad-hoc com o awk poderia ser algo assim:
awk '/^header_/ {n=1+1} /^data_/ {n=1+2} n-- > 0; n == 0 {print "---"}' < file
n
é definido em linhas correspondentes e é decrementado para cada linha. As linhas são impressas quando n
é positivo com um separador após cada bloco. Com os valores acima, seria impressa header_
linhas mais uma próxima linha e data_
linhas mais duas próximas linhas.
Se os blocos de contexto puderem se sobrepor, o novo valor de n
substituirá o valor anterior. Para evitar isso, adicione condições para proteger as atribuições:
awk '/^header_/ {if (n < 2) n=2}
/^data_/ {if (n < 5) n=5}
n-- > 0; n == 0 {print "---"}' < file
Isso deve ser melhor para lidar com casos em que há data_
e header_
em linhas consecutivas.