Tengo el siguiente código que eliminará líneas con el patrón bananay 2 líneas después:
sed '/banana/I,+2 d' file
¡Hasta aquí todo bien! Pero lo necesito para eliminar 2 líneas antes banana , pero no puedo obtenerlo con un "signo menos" o lo que sea (similar a lo que grep -v -B2 banana filedebería hacer, pero no lo hace):
teresaejunior@localhost ~ > LC_ALL=C sed '-2,/banana/I d' file
sed: invalid option -- '2'
teresaejunior@localhost ~ > LC_ALL=C sed '/banana/I,-2 d' file
sed: -e expression #1, char 16: unexpected `,'
teresaejunior@localhost ~ > LC_ALL=C sed '/banana/I,2- d' file
sed: -e expression #1, char 17: unknown command: `-'
tac file | sed ... | tac. : P
sed '/banana/,+2d' file eso también funcionará
awk 'tolower($0)~/bandana/{print prev[!idx];print prev[idx]} {idx=!idx;prev[idx]=$0}' filein dado que este es un comentario y no una respuesta (ya hay otras respuestas), no entraré en demasiados detalles, pero el quid de la cuestión es que siempre tiene la dos registros anteriores en Anterior [0] y anterior [1], el "más fresco", según la iteración pero siempre en prev[idx], por lo que cuando se imprime, se imprimen en !idxentonces idxorden. En cualquier caso, alterne idxy coloque el registro actual prev[idx].
awk '{l[m=NR]=$0}/banana/{for(i=NR-2;i<=NR;i++)delete l[i]}END{for(i=1;i<=m;i++)if(i in l)print l[i]}'. Esto no es eficiente, así que esto es solo una pista, no una solución.