Saya memiliki kode berikut yang akan menghapus garis dengan pola banana
dan 2 baris setelahnya:
sed '/banana/I,+2 d' file
Sejauh ini baik! Tapi saya perlu menghapus 2 baris sebelumnya banana
, tapi saya tidak bisa mendapatkannya dengan "tanda minus" atau apa pun (mirip dengan apa yang grep -v -B2 banana file
harus dilakukan tetapi tidak):
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
itu juga akan berhasil
awk 'tolower($0)~/bandana/{print prev[!idx];print prev[idx]} {idx=!idx;prev[idx]=$0}' filein
Karena ini adalah komentar dan bukan jawaban (sudah ada jawaban lain), saya tidak akan membahas terlalu banyak detail, tetapi intinya adalah Anda selalu memiliki dua catatan sebelumnya dalam prev [0] dan prev [1], "segar" tergantung pada iterasi mana tetapi selalu di prev[idx]
, jadi ketika Anda mencetak, Anda mencetak !idx
kemudian idx
memesan. Apapun, gantilah idx
dan masukkan catatan saat ini 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]}'
. Ini tidak efisien, jadi ini hanya petunjuk, bukan solusi.