У меня есть следующий код, который удалит строки с шаблоном banana
и 2 строки после него:
sed '/banana/I,+2 d' file
Все идет нормально! Но мне нужно, чтобы он убрал 2 строки раньше 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
как это комментарий, а не ответ (уже есть другие ответы), я не буду вдаваться в подробности, но суть в том, что у вас всегда есть предыдущие две записей в пред [0] и пред [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]}'
. Это неэффективно, так что это всего лишь подсказка, а не решение.