Xóa một phạm vi n dòng trước và sau một dòng phù hợp?


12

Tôi có một tệp cấu hình lặp đi lặp lại và tôi muốn khớp một biểu thức chính quy và xóa một loạt các dòng trước và sau một trận đấu. Tôi cũng muốn xóa trận đấu trong một lệnh.

Tôi có thể sử dụng...

:g/match/-1d

... nhiều lần để xóa nhiều hơn một dòng từ trước trận đấu ...

... và kết hợp nó với một vài cuộc gọi đến ...

:g/match/+1d

... để xóa nhiều hơn một dòng sau trận đấu ...

Nhưng có cách nào để xóa một loạt các dòng, trước, sau và bao gồm, khớp với một lệnh không?

Câu trả lời:


21

Bạn đã gần tới; bạn cũng có thể chỉ định một phạm vi các dòng, ở dạng [line1],[line2][command], thay vì chỉ [line][command](như bạn đang sử dụng bây giờ).

Bạn có thể sử dụng .để tham khảo các dòng hiện tại.

  • Đối với dòng hiện tại và tiếp theo: :g/match/.,+1d
  • Đối với dòng hiện tại và trước đó: :g/match/-1,.d
  • Đối với dòng trước, hiện tại và tiếp theo: :g/match/-1,+1d

Xem :help [range]để biết thêm thông tin, và trong câu trả lời này có một vài ví dụ nữa .


Là cú pháp giống nhau trong sed?
leeand00

3
@ leeand00 Không. Tất cả những gì :glàm là chạy một lệnh ex trên các dòng khớp với một mẫu. Vì vậy, gõ :g/match/.,+1dsẽ giống hệt như đi đến tất cả các dòng matchvà gõ:.,+1d
Martin Tournoij

Đây là điều tuyệt vời nhất mà tôi đã học được trên vim trong một thời gian. Cám ơn vì đã chia sẻ!
LPS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.