У мене є такий код, який видалить рядки з малюнком banana
та 2 рядки після нього:
sed '/banana/I,+2 d' file
Все йде нормально! Але мені це потрібно, щоб вилучити два рядки раніше banana
, але я не можу отримати його зі знаком "мінус" або будь-яким іншим (подібним до того, що grep -v -B2 banana file
слід робити, але ні):
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
що також буде працювати
awk 'tolower($0)~/bandana/{print prev[!idx];print prev[idx]} {idx=!idx;prev[idx]=$0}' filein
Оскільки це коментар, а не відповідь (вже є інші відповіді), я не буду надто детально описуватись, але суть цього у вас завжди є попередні два записи в prev [0] та prev [1], "найсвіжіші", залежно від того, яка ітерація, але завжди в prev[idx]
, тому, коли ви друкуєте, ви друкуєте в !idx
такому idx
порядку. Незалежно, чергуйте idx
і ставите поточний запис 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]}'
. Це неефективно, тому це лише натяк, а не рішення.