2013-04-22 41 views
5

Nói rằng tôi có dòng như thế này:tìm kiếm và thay thế mà không cần tốn nhiều những gì bạn đang tìm kiếm

'alpha' 123 
'beta' 678 
'alpha' 998 
'gamma' 212 

Và sử dụng tìm kiếm & thay thế regex trong VIM, biến nó thành này:

'alpha' 123 : alpha 
'beta' 678 : beta 
'alpha' 998 : alpha 
'gamma' 212 : gamma 

Về cơ bản , tìm kiếm sẽ không thay thế những gì nó đang tìm kiếm, mà thay vào đó, chỉ sử dụng nó cho một thứ khác. Trong đầu của tôi, điều này sẽ hoạt động:

:g/'\(.*\)'/s/$/: \1/g 

Nhưng điều đó không làm được. Làm thế nào để tôi không tiêu thụ những gì tôi đang tìm kiếm nhưng giữ lại nó để sử dụng?

Trả lời

1

Bạn có thể làm điều đó trực tiếp trong lệnh thay thế, sử dụng \zs là thực sự hữu ích cho việc xây dựng những thứ như độ rộng không khớp (không "tiêu thụ").

:%s/'\(.*\)'.*\zs/ : \1 

\zs đánh dấu sự bắt đầu của trận đấu. Nó giống như "bắt đầu trận đấu tại đây". Vì vậy, đầu tiên nội dung của dấu ngoặc đơn được chụp, sau đó thêm .* khớp với mọi thứ cho đến cuối dòng và \zs bây giờ đặt lại đối sánh với điểm đó, có nghĩa là không phải là một phần của trận đấu, nhưng nội dung của các parens đã bị bắt.

Phần thay thế sẽ thay thế vị trí cuối cùng của dòng bằng : và nhóm phù hợp.

:h \zs

+1

Đây là exac tly những gì tôi đã hy vọng! Cảm ơn! – Bromide

0

Lệnh này nên làm việc:

:%s/\v'(\w*)'.*/\0 : \1 

(tốt, nó đã làm ở đây với văn bản mẫu của bạn)

5

Các ban đầu g cho phù hợp với không chụp để thay thế; nó chỉ được sử dụng để nhóm cho tìm kiếm. Thay vào đó, hãy sử dụng tính năng này, cũng đơn giản hơn một chút:

%s/'\(.*\)'.*/& : \1/ 

Thay thế mọi thứ đã khớp.

+0

Tôi đang sử dụng một biến thể của ví dụ về sidyll nhưng cũng tốt :-) – Bromide

0

công trình vĩ mô ví dụ của bạn quá: (không kiểm tra trong vim, nhưng nên làm việc.)

con trỏ vào đầu dòng 1:

qqyi'A : <esc>pjq 

sau đó [email protected] (x là số lần bạn muốn làm)

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