2011-09-07 37 views
8

Tôi có một regex để thay thế một mẫu nhất định bằng một chuỗi nhất định, nhưng tôi muốn làm cho nó trở nên năng động hơn.Vim regex thay thế bằng n ký tự

Ví dụ, nói rằng tôi có regex này:

%s/hello/-----/g

Tôi sẽ, tuy nhiên, muốn làm một cái gì đó giống như thay vì điều này:

%s/hello/-{5}/g

có nghĩa là thay thế xin chào với 5 dấu gạch ngang.

Có cách nào để thực hiện việc này không?

Cuối cùng, tôi muốn làm một cái gì đó như thế này:

%s/(hello)*/-{\=strlen(\0)}/g

mà sẽ thay thế bất kỳ trường hợp của một chuỗi các chỉ hello s với dấu gạch ngang có chiều dài bằng với chiều dài của chuỗi phù hợp .

Trả lời

19
%s/\v(hello)*/\=repeat('-',strlen(submatch(0)))/g 
+0

Hoạt động! Cảm ơn. Bạn có biết nơi tôi có thể tìm thấy tất cả các chức năng có sẵn (như strlen và lặp lại)? – tjameson

+3

': h functions' sẽ thực hiện thủ thuật –

+3

Hoặc' function-list'. Đôi khi nó tiện dụng hơn. – sidyll

5

Thay vì sử dụng lệnh thay thế, người dùng có thể tự động chỉnh sửa lệnh cho thực hiện thay thế. Cách đơn giản nhất để ghi đè các lần xuất hiện của mẫu tìm kiếm có ký tự cụ thể bằng tay là như sau.

  1. Tìm kiếm sự bắt đầu của lần xuất hiện tiếp theo.

    /\(hello\)\+ 
    
  2. Chọn văn bản phù hợp cho đến khi kết thúc.

    v//e 
    
  3. Thay thế văn bản đã chọn.

    r- 
    
  4. Lặp lại từ bước 1.

Vì vậy, để tự động chạy thói quen này lệnh

:let[@/,@s]=['\(hello\)\+',"//\rv//e\[email protected]"] 

và thực hiện các nội dung về điều đó s đăng ký bắt đầu từ đầu bộ đệm (hoặc từ vị trí thích hợp khác):

[email protected] 
+0

+1 cho macro đệ quy và sử dụng '// e' –

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