Tôi có thể thực hiện: s chỉ hoạt động trên trận đấu cuối cùng của dòng không?


16

:s/pattern/replacementhoạt động trên trận đấu đầu tiên và :s/pattern/replacement/gtrên tất cả.

Làm thế nào để chỉ hoạt động trên cái cuối cùng?

Câu trả lời:


18

tôi sẽ dùng \zs

:%s/.*\zspattern/replacement/

Một chút giải thích:

  • . đại diện cho bất kỳ nhân vật duy nhất
  • * đại diện cho sự phù hợp tham lam (càng nhiều càng tốt)

Trong Vim, bạn có thể sử dụng các neo có độ rộng bằng không \zs\zeđể xác định điểm bắt đầu và kết thúc của mẫu được tìm kiếm mà bạn muốn khớp. Bất cứ điều gì trước \zsvà sau \zetrong mô hình của bạn sẽ vẫn không bị ảnh hưởng bởi sự thay thế.

Để làm cho nó dễ dàng để hiểu, tôi muốn sử dụng ví dụ này từ Wikia 's tìm kiếm và thay thế :

Lưu gõ bằng cách sử dụng \zs\zeđể đặt bắt đầu và kết thúc của một mẫu. Ví dụ: thay vì:

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/ 

Sử dụng:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

Để biết thêm thông tin, hãy nhìn vào


Bạn có thể vui lòng cung cấp một mô tả cơ bản về những gì \zstrong câu trả lời của bạn?
EvergreenTree

3
Nó đáng chú ý là những lý do làm việc này là vì .*tham lam .
tự đại diện

7

Bạn có thể tìm kiếm trận đấu cuối cùng bằng cách nhóm tất cả \(.*\), nhưng lần cuối cùng của pattern. Sau đó thoát ra với nhóm bị bắt \1và thêm replacement.

:%s/\(.*\)pattern/\1replacement/

(Đây là thua kém @ ryuichiro của \zsgiải pháp, trong đó bạn \1tiếp cận là chức năng tương đương, nhưng tiết hơn (Mặt khác, nó có thể được dễ dàng hơn để nhớ cho một số người, đặc biệt là nếu chúng được sử dụng để hương vị regex khác)..)
Aaron Thoma

0

Để hoàn thiện, tôi nghĩ tôi sẽ đăng một bài thay thế. Vim có nhiều mục tương tự như các xác nhận tìm kiếm biểu thức chính quy tiêu chuẩn hơn (nhìn tiêu cực / tích cực / lookbehind). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups

Trong trường hợp này, chúng tôi muốn có một cái nhìn tiêu cực \@!, có nghĩa là chúng tôi muốn khẳng định rằng nguyên tử đi trước vật phẩm không xảy ra sau mẫu . Trong trường hợp này, nguyên tử là mẫu tự đi trước bởi bất kỳ thứ gì khác:

:%s/pattern\(.*pattern\)\@!/replacement/

Phần bên trong dấu ngoặc đơn có độ rộng bằng 0 và không được bao gồm trong kết quả khớp nên không được thay thế bằng sự thay thế.

:h \@!để biết thêm thông tin hoặc :h pattern-multi-itemscho toàn bộ phần có chứa các biến thể nhìn khác.

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.