Dengan sed
:
sed '$!N;/remove/!P;D' infile
Ini menarik N
garis 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 P
terputus ke \n
karakter ewline pertama (yaitu mencetak baris pertama). Kemudian D
menghapus hingga \n
karakter 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
, D
siklus jika Anda menambahkan l
sebelum dan setelah N
melihat 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)