Sed não recua: uma vez processada uma linha, é feito. Então, “encontrar uma linha e imprimir as N linhas anteriores” não vai funcionar como está, ao contrário de “encontrar uma linha e imprimir as próximas N linhas”, que é fácil de enxertar.
Se o arquivo não for muito longo, já que você parece estar bem com as extensões GNU, você pode usar tac
para reverter as linhas do arquivo.
tac | sed '/banana/I,+2 d' | tac
Outro ângulo de ataque é manter uma janela deslizante em uma ferramenta como o awk. Adaptação de Existe alguma alternativa para os switches -A -B-C do grep (para imprimir algumas linhas antes e depois)? (aviso: minimamente testado):
#!/bin/sh
{ "exec" "awk" "-f" "$0" "$@"; } # -*-awk-*-
# The array h contains the history of lines that are eligible for being "before" lines.
# The variable skip contains the number of lines to skip.
skip { --skip }
match($0, pattern) { skip = before + after }
NR > before && !skip { print NR h[NR-before] }
{ delete h[NR-before]; h[NR] = $0 }
END { if (!skip) {for (i=NR-before+1; i<=NR; i++) print h[i]} }
Uso: /path/to/script -v pattern='banana' -v before=2