Mam następujący kod, który usunie linie ze wzorem banana
i 2 linie po nim:
sed '/banana/I,+2 d' file
Jak na razie dobrze! Ale muszę go usunąć 2 linie przed banana
, ale nie mogę go z „minus” lub cokolwiek (podobny do tego, co grep -v -B2 banana file
należy zrobić, ale nie robi):
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
, to też zadziała
awk 'tolower($0)~/bandana/{print prev[!idx];print prev[idx]} {idx=!idx;prev[idx]=$0}' filein
ponieważ jest to komentarz, a nie odpowiedź (istnieją już inne odpowiedzi), nie będę wchodził w zbyt szczegółowe szczegóły, ale sedno tego jest takie, że zawsze masz poprzednie dwa rekordy w poprz [0] poprzednie [1] „najświeższych” w zależności od tego, która iteracji, ale zawsze prev[idx]
, więc podczas drukowania, drukowanie w !idx
ówczesnego idx
porządku. Niezależnie od tego naprzemiennie idx
i wprowadź bieżący rekord 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]}'
. To nie jest wydajne, więc jest to tylko wskazówka, a nie rozwiązanie.