2012-10-04 17 views
10

Có thể thay thế cụm từ thông dụng bằng một số được tạo ngẫu nhiên trong Vim không? Số (ngẫu nhiên) được thay thế phải khác nhau đối với mỗi mẫu phù hợp với cụm từ thông dụng. Đây là một ví dụ về những gì tôi cần.Vim thay thế Regex bằng các số được tạo ngẫu nhiên

Input File:

<a>XYZ</a> 
<a>XYZ</a> 
<a>XYZ</a> 
<a>XYZ</a> 

Sau khi thay XYZ với những con số ngẫu nhiên, sản lượng có thể là:

<a>599</a> 
<a>14253</a>  
<a>1718</a> 
<a>3064</a> 

Trả lời

18

Nếu bạn không nhớ một chút perl trong vim, bạn có thể sử dụng

:%! perl -pne 's/XYZ/int(rand 1000)/ge' 

Edit: được cập nhật để cho phép thay thế không giới hạn trên một dòng nhất định, theo đề xuất của @ hobbes3, do đó,

XYZ XYZ 
XYZ XYZ XYZ 
XYZ XYZ XYZ XYZ XYZ XYZ 
XYZ XYZ 

Trở thành một cái gì đó như

86 988 
677 477 394 
199 821 193 649 502 471 
732 208 
+0

Cảm ơn! Điều đó thật đơn giản! Tôi không biết rằng bạn có thể trực tiếp chạy perl từ vim. – krjampani

+2

Bạn có thể chạy * mọi thứ * bên trong vim. Xem http://www.commandlinefu.com/commands/view/1204/save-a-file-you-edited-in-vim-without-the-needed-permissions để có một ví dụ đặc biệt hữu ích. –

+0

Sẽ tạo ra một int ngẫu nhiên mới cho mỗi dòng hay nó chỉ sử dụng một int ngẫu nhiên duy nhất? –

5

Hãy thử điều này: đặt mã dưới đây để một bộ đệm sau đó nguồn nó (:source %).

let rnd = localtime() % 0x10000 

function! Random() 
    let g:rnd = (g:rnd * 31421 + 6927) % 0x10000 
    return g:rnd 
endfun 

function! Choose(n) " 0 n within 
    return (Random() * a:n)/0x10000 
endfun 

Sau đó, bạn có thể làm:

:s_\(<a>\).*\(</a>\)_\1\=Choose(line('.')*100).\2_ 
+0

Chỉ để tham khảo, điều này là KHÔNG ngẫu nhiên. Nhưng đối với trường hợp sử dụng nó là đủ tốt. – Sukima

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