Dengan sed:
sed '$!N;/remove/!P;D' infile
Ini menarik Ngaris ext ke dalam ruang pola (jika tidak !pada $garis t) dan memeriksa apakah ruang pola cocok remove. Jika tidak (berarti tidak ada satu pun dari dua garis dalam ruang pola yang berisi string remove), maka akan Pterputus ke \nkarakter ewline pertama (yaitu mencetak baris pertama). Kemudian Dmenghapus hingga \nkarakter baris pertama dan memulai ulang siklus. Dengan cara ini, tidak ada lebih dari dua garis dalam ruang pola.
Itu mungkin lebih mudah untuk memahami N, P, Dsiklus jika Anda menambahkan lsebelum dan setelah Nmelihat ruang pola:
sed 'l;$!N;l;/remove/!P;D' infile
jadi, gunakan hanya enam baris terakhir dari contoh Anda:
8AC3
remove
8AE4
8AE5
8AE6
remove
output perintah terakhir:
8AC3 $
8AC3 \ n hapus $
hapus $
hapus \ n 8AE4 $
8AE4 $
8AE4 \ n 8AE5 $
8AE4
8AE5 $
8AE5 \ n 8AE6 $
8AE5
8AE6 $
8AE6 \ n hapus $
hapus $
hapus $
Berikut ini penjelasan singkatnya:
cmd output cmd
l 8AC3$ N # read in the next line
l 8AC3\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ N # read in the next line
l remove\n 8AE4$ D # delete up to \n (pattern space matches so no P)
l 8AE4$ N # read in the next line
l 8AE4\n 8AE5$ # pattern space doesn't match so print up to \n
P 8AE4 D # delete up to \n
l 8AE5$ N # read in the next line
l 8AE5\n 8AE6$ # pattern space doesn't match so print up to \n
P 8AE5 D # delete up to \n
l 8AE6$ N # read in the next line
l 8AE6\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ # last line so no N
l remove$ D # delete (pattern space matches so no P)