Sự xuất hiện thay thế VIM của mẫu sau một từ cụ thể trong một dòng


7

Tôi có những dòng như vậy trong văn bản của tôi.

văn bản trước mẫu = rác ** văn bản sau mẫu là mẫu

Nếu trong VIM tôi làm điều %s/pattern/saturn/đó thay thế tất cả các lần xuất hiện của pattern. Nhưng tôi chỉ muốn thay thế những lần xuất hiện sau đó =. Nó nên bỏ qua mọi thứ trong dòng xảy ra trước đó =. Làm thế nào để làm điều đó?

Câu trả lời:


3

Bạn có thể sử dụng nguyên tử đặc biệt \@<=để xác nhận trận đấu trước ( =.*để thực hiện ở bất kỳ đâu trước dòng đó):

:%s/\(=.*\)\@<=pattern/saturn/g

bạn có thể giải thích làm thế nào điều này làm việc?
dùng13107

1
Đọc :help /\@<=(tôi không thể giải thích điều đó tốt hơn), nhưng đừng cảm thấy tồi tệ khi bạn không hiểu nó trước. Nó được gọi là cái nhìn tích cực , và khá tiên tiến.
Ingo Karkat

+1 Thực sự thanh lịch. Điều thú vị là, giao diện chiều rộng thay đổi không được hỗ trợ trong Perl! Tôi chưa bao giờ nghĩ rằng công cụ regex Perl sẽ thiếu những thứ mà các công cụ khác có.
Joseph R.

5

Giả sử bạn chỉ có một lần xuất hiện patterntrước đó =, bạn có thể thực hiện việc này theo hai bước:

:%s/pattern/saturn/g
:%s/saturn\(.\{-}=\)/pattern\1/

Các \{-}hướng dẫn .để phù hợp với lười biếng (còn gọi là không tham lam).

Giải trình

Bước đầu tiên này thay thế tất cả các lần xuất hiện của patterncủa saturnbước tiếp theo sau đó tìm kiếm từ saturntrước =và thay thế nó bằng pattern.

Thận trọng

Điều này giả định một lần xuất hiện duy nhất =trên mỗi dòng.

Một cách tốt hơn (chỉ giả sử một =dòng trên mỗi dòng)

Bạn có thể làm điều đó với một macro đệ quy:

qaqqa:%s/\(=.\{-}\)pattern/\1saturn/@aq@a

Điều này thay thế một lần xuất hiện patternsau =với saturn. Khi được lưu trữ dưới dạng macro và được gọi đệ quy, nó sẽ tiếp tục hoạt động trên tệp cho đến khi không còn gì để thay thế. Đó là hackish nhưng nó hoạt động.

Xem thêm


Điều này sẽ thay thế tất cả các lần xuất hiện của mẫu sau =? Làm sao? Tôi không biết sẽ có bao nhiêu trước đó.
dùng13107

@ user13107 Câu trả lời ban đầu của tôi chỉ thay thế một trường hợp patternsau =. Xin vui lòng xem câu trả lời cập nhật.
Joseph R.

Cảm ơn người bạn đời, thật thông minh, thật không may, có một số lượng chưa biết trước đó =:( argh
user13107

@ user13107 Tôi có một bản hack để khắc phục điều này. Sẽ đăng khi tôi có thời gian.
Joseph R.

điều này cũng giả sử rằng chuỗi saturnkhông có trong văn bản. có lẽ đúng, nhưng tôi sẽ có xu hướng sử dụng một cái gì đó tối nghĩa / độc đáo hơn nhiều như là chuỗi thay thế tạm thời - myhamsterlivesonsaturn, có lẽ :)
cas
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.