Jika ada garis segera setelah pertandingan harus dihapus maka sed
program Anda harus mempertimbangkan pertandingan berturut-turut. Dengan kata lain, jika Anda menghapus garis mengikuti pertandingan yang juga cocok, maka mungkin Anda harus menghapus garis yang mengikuti itu juga.
Ini diterapkan cukup sederhana - tetapi Anda harus melihat ke belakang sedikit.
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
Ini bekerja dengan menukar ruang pegang dan pola untuk setiap baris yang dibaca - sehingga baris terakhir dapat dibandingkan dengan saat ini setiap kali. Jadi ketika sed
membaca sebuah baris, ia bertukar konten buffer-nya - dan baris sebelumnya kemudian isi dari buffer editnya, sedangkan baris saat ini diletakkan di ruang penyimpanan.
Jadi, sed
periksa baris sebelumnya untuk kecocokan match
, dan jika !
tidak ditemukan dua ekspresi dalam {
fungsi }
dijalankan. sed
akan g
et pegangan ruang dengan Timpa ruang pola - yang berarti baris saat kemudian di kedua ditahan dan pola ruang - dan kemudian akan //
memeriksa untuk pertandingan ke ekspresi reguler yang paling baru-baru ini disusun - match
- dan jika itu tidak match
itu adalah p
rinted.
Ini berarti suatu garis hanya dicetak jika tidak dan garis sebelumnya tidak . Ini juga membatalkan pertukaran yang tidak perlu untuk urutan es.match
match
match
Jika Anda menginginkan versi yang dapat menjatuhkan jumlah baris sewenang-wenang yang terjadi setelahnya, match
itu akan membutuhkan sedikit lebih banyak pekerjaan:
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... ganti 5 dengan jumlah garis (termasuk garis yang cocok) yang ingin Anda hapus ...
1
2
3
4
12
13
14
21