Tengo el siguiente código que eliminará líneas con el patrón banana
y 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 file
deberí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 !idx
entonces idx
orden. En cualquier caso, alterne idx
y 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.