Eu tenho o seguinte código que removerá linhas com o padrão banana
e 2 linhas depois dele:
sed '/banana/I,+2 d' file
Por enquanto, tudo bem! Mas preciso remover duas linhas antes banana
, mas não consigo obtê-lo com um "sinal de menos" ou o que for (semelhante ao que grep -v -B2 banana file
deve fazer, mas não faz):
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
que também funcionará
awk 'tolower($0)~/bandana/{print prev[!idx];print prev[idx]} {idx=!idx;prev[idx]=$0}' filein
como esse é um comentário e não uma resposta (já existem outras respostas), não entrarei em muitos detalhes, mas o ponto crucial é que você sempre tem o anteriores dois registros em prev [0] e prev [1], o "mais frescos" dependendo de qual iteração mas sempre prev[idx]
, então quando você imprimir, você imprime em !idx
seguida idx
ordem. Independentemente disso, alterne idx
e insira o registro atual 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]}'
. Isso não é eficiente, portanto, é apenas uma dica, não uma solução.