Desenli banana
satırları ve ondan sonraki 2 satırı kaldıracak aşağıdaki kodu kullanıyorum :
sed '/banana/I,+2 d' file
Çok uzak çok iyi! Fakat daha önce 2 satırı kaldırmak için ihtiyacım var banana
, ancak “eksi işareti” veya başka bir şeyle elde edemiyorum (ne grep -v -B2 banana file
yapmalı ama yapmamalı gibi):
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
bunun da işe yarayacağını yapmış olabilirsiniz
awk 'tolower($0)~/bandana/{print prev[!idx];print prev[idx]} {idx=!idx;prev[idx]=$0}' filein
Bu bir yorum ve bir cevap olmadığı için (zaten başka cevaplar var), çok fazla ayrıntıya girmeyeceğim, ama bunun özü her zaman sizin prev [0] ve prev [1] önceki iki kayıtları, "taze" hangi yineleme üzerinde ama her zaman içinde bağlı prev[idx]
yazdırma sırasında, peki yazdırmak !idx
ardından idx
sırayla. Ne olursa olsun, alternatif idx
ve geçerli kayıt içine yerleştirin 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]}'
. Bu verimli değil, bu yüzden sadece bir ipucu, bir çözüm değil.