2012-10-04 39 views
10

用Vim中的隨機生成的數字替換正則表達式有可能嗎?對於與正則表達式匹配的每個模式,要替換的(隨機)數應該不同。這是我需要的一個例子。Vim用隨機生成的數字替換正則表達式

輸入文件:

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

利用隨機數代以XYZ後,輸出可以是:

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

回答

18

如果你不介意在你的vim一點Perl中,你可以使用

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

編輯:更新到允許無限制換人一個給定的行,每個hobbes3的建議,所以

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

變得像

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

謝謝!那太簡單了!我不知道你可以直接從vim運行perl。 – krjampani

+2

你可以在vim裏運行*任何東西*。有關特別有用的示例,請參閱http://www.commandlinefu.com/commands/view/1204/save-a-file-you-edited-in-vim-without-the-needed-permissions。 –

+0

會爲每行產生一個新的隨機int還是隻使用一個隨機int? –

5

嘗試此:將以下代碼到一個緩衝器然後,源它(: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 

然後,你可以這樣做:

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

僅供參考,這不是隨機的。但是對於用例來說,這足夠好。 – Sukima