A mesma abordagem de Glenn Jackman, mas com um buffer circular em vez de girar o buffer em todas as entradas:
awk -v N=2 -v TARGET=" H " -v PLACE="X X X X X" '
function check(n, s, i) {
a[n%NN]=s
if (n>N&&a[(n-N)%NN]~TARGET) {
for (i=n+1;i<=n+NN;++i)
print a[i%NN]
print ""
}
}
BEGIN{
NN=2*N+1
a[0]=PLACE
for (i=1;i<=N;++i) { getline a[i]; a[i+N]=PLACE }
}
{ check(NR,$0) }
END{
for (i=NR+1;i<=NR+N;++i) check(i,PLACE)
}'