2012-04-26 24 views
28

Ví dụ, tôi có một loạt các giá trị với một tiền tố chung và postfix, chẳng hạn như:Có thể sử dụng tìm và thay thế trên một chuỗi ký tự đại diện trong VIM không?

fooVal1Bar; 

fooVal2Bar; 

fooVal3Bar; 

Trong trường hợp này, tất cả các tên biến bắt đầu và kết thúc bằng foo và kết thúc bằng Bar. Tôi muốn sử dụng tìm và thay thế bằng tên biến ngẫu nhiên được tìm thấy giữa fooBar. Giả sử tôi đã có biến số Val1, Val2, Val3Val1Old, Val2OldVal3Old Được xác định. Tôi sẽ làm một tìm một thay thế, một cái gì đó dọc theo dòng:

:%s/foo<AnyString>Bar/foo<AnyString>Bar = <AnyString> + <AnyString>Old 

này sẽ cho kết quả:

fooVal1Bar = Val1 + Val1Old; 

fooVal2Bar = Val2 + Val2Old; 

fooVal3Bar = Val3 + Val3Old; 

Tôi hy vọng đó là rõ ràng những gì tôi muốn làm, tôi không thể tìm thấy bất cứ điều gì trong vim giúp hoặc trực tuyến về việc thay thế bằng các chuỗi ký tự đại diện. Điều tôi có thể tìm thấy nhiều nhất là tìm kiếm các chuỗi ký tự đại diện.

Trả lời

41

Tôi tin rằng bạn muốn

:%s/foo\(\w\+\)Bar/& = \1 + \1\Old/ 

giải thích:

\w\+ tìm thấy một hoặc nhiều lần xuất hiện của một nhân vật. Tiền tố foo và sau Thanh đảm bảo rằng các ký tự phù hợp này chỉ nằm giữa một số fooBar.

\(...\) lưu trữ các ký tự này để chúng có thể được sử dụng trong phần thay thế của thay thế.

& bản những gì đã xuất hiện

\1 là chuỗi bắt ở phần \(....\).

+0

là có một sự khác biệt giữa \ w \ + và *.? – dwcanillas

+7

'\ w \ +' khớp với một hoặc nhiều trong tập hợp này: a-zA-Z0-9_ và '. *' Khớp với số không hoặc nhiều hơn bất kỳ thứ gì. – gpojd

+0

Ah ok. Điều đó có ý nghĩa. Cảm ơn! – dwcanillas

2

Bạn cần nắm bắt những gì bạn muốn lưu. Hãy thử một cái gì đó như thế này:

%s/\(foo\(\w\+\)Bar\);/\1 = \2 \2Old/ 

Hoặc bạn có thể làm sạch nó lên một chút với magic:

%s/\v(foo(\w+)Bar);/\1 = \2 \2Old/ 
Các vấn đề liên quan