2013-06-24 30 views
7

Trong một tệp, tôi muốn có thể xóa ngữ cảnh xung quanh mẫu tìm kiếm.Làm thế nào để xóa các dòng xung quanh mẫu tìm kiếm trong vim?

By bối cảnh Ý tôi là: a) 'n' dòng trước khi mô hình b) 'n' dòng sau mô hình c) 'n' dòng sau và trước khi mô hình d) làm a, b, c bằng cách xóa dòng mẫu cũng như e) thực hiện a, b, c mà không xóa dòng mẫu

Có cách nào để thực hiện việc này bằng cách sử dụng :g/ hoặc :%s hoặc một cách khác? Tôi có thể làm điều này với các macro, nhưng đó không phải là những gì tôi đang tìm kiếm.

Đây là văn bản mẫu:

search_pattern random text 1 
line below search pattern(delete me) 
abc def 
pqr stu 
... 
line above search pattern(delete me) 
search_pattern random text 2 
line below search pattern(delete me) 
... 

Trả lời

15

Về cơ bản các mấu chốt là

  • :d có thể mất một đối số sau nó mà xác định số dòng để xóa
  • bạn có thể chỉ định một bù đắp sau một mẫu, ví dụ :/patt/+3

Ghi chú:

  • Nếu bạn đang làm điều này cho tất cả các trường hợp của mô hình, sử dụng :g/patt/... thay vì :/patt/... (nhờ Peter Rincker cho lời nhắc nhở)
  • tất cả các khoảng trống trong các cựu các lệnh dưới đây là tùy chọn, tôi đặt nó ở đó vì mục đích rõ ràng.

Để xóa dòng n trước khi mô hình,

:/patt/-n d n 

Để xóa dòng n trước khi mô hình dòng mẫu

:/patt/-n d p 

nơi p = n + 1


Để xóa dòng n sau khi mô hình,

:/patt/+ d n 

Để xóa dòng n sau khi mô hình dòng mẫu

:/patt/ d p 

nơi p = n + 1


Để xóa dòng m trước và n dòng sau mô hình (kinda gian lận ở đây vì nó là 2 lệnh),

:/patt/-m d m | + d n 
  • làm việc này vì sau khi lệnh đầu tiên d, con trỏ sẽ được trên dòng mẫu

Để xóa dòng m trước khi mô hình, dòng mô hình, và n dòng sau mô hình

:/patt/-m d q 

nơi q = m + n + 1

+2

Điều này phù hợp với 1 ví dụ của mẫu. Chỉ cần thêm ': g' cho tất cả các mẫu. Ví dụ: ': g/pat/-3d3'. Xem ': h: g' để được trợ giúp thêm. –

4

Trong mỗi trường hợp, bạn có thể sử dụng phạm vi tương đối hoặc chênh lệch và đối số d. Tùy chọn đơn giản hơn về mặt logic phụ thuộc vào trường hợp cụ thể; Tôi có xu hướng sử dụng phạm vi rõ ràng trong các trường hợp bao gồm (vì bạn thường có thể bỏ qua một nửa phạm vi) và đối số là d nếu không.

Trước khi mô hình, bao gồm:

:g/regex/-3,d 
:g/regex/-3d4 

Trước khi mô hình, không bao gồm:

:g/regex/-3,-1d 
:g/regex/-3d3 

Sau khi mô hình, bao gồm:

:g/regex/,+3d 
:g/regex/d4 

Sau khi mô hình, không bao gồm:

:g/regex/+1,+3d 
:g/regex/+1d3 

Trước và sau đó, bao gồm:

:g/regex/-3,+3d 
:g/regex/-3d7 

Trước và sau đó, độc quyền:

:g/regex/-3,-1d|+1,+3d 
:g/regex/-3d3|+1d3 

Lưu ý rằng các lệnh này sẽ thất bại với E16: Invalid range nếu phạm vi đi qua đầu hoặc cuối của tập tin .

Các vấn đề liên quan