Menghapus rentang n baris sebelum dan sesudah baris yang cocok?

12

Saya memiliki file konfigurasi berulang dan saya ingin mencocokkan regex dan menghapus berbagai baris sebelum, dan setelah pertandingan. Saya juga ingin menghapus kecocokan dalam satu perintah.

Saya bisa menggunakan ...

:g/match/-1d

... beberapa kali untuk menghapus lebih dari satu baris dari sebelum pertandingan ...

... dan gabungkan dengan beberapa panggilan ke ...

:g/match/+1d

... untuk menghapus lebih dari satu baris setelah pertandingan ...

Tetapi apakah ada cara untuk menghapus serangkaian garis, sebelum, setelah dan termasuk, kecocokan dengan satu perintah?

Leandand00
sumber

Jawaban:

21

Kamu hampir sampai; Anda juga dapat menentukan rentang garis, yang dalam bentuk [line1],[line2][command], bukan hanya [line][command](seperti yang Anda gunakan sekarang).

Anda dapat menggunakan .untuk merujuk ke baris saat ini.

  • Untuk baris saat ini & selanjutnya: :g/match/.,+1d
  • Untuk baris saat ini & sebelumnya: :g/match/-1,.d
  • Untuk baris sebelumnya, saat ini, dan berikutnya: :g/match/-1,+1d

Lihat :help [range]untuk informasi lebih lanjut, dan dalam jawaban ini ada beberapa contoh lagi .

Martin Tournoij
sumber
Apakah sintaksnya sama dengan sed?
leeand00
3
@ leeand00 No. Semua yang :gdilakukan adalah menjalankan perintah ex pada baris yang cocok dengan pola. Jadi mengetik :g/match/.,+1dsama persis dengan pergi ke semua baris match, dan mengetik:.,+1d
Martin Tournoij
Ini adalah hal paling keren yang saya pelajari di vim untuk sementara waktu. Terima kasih telah berbagi!
lps