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>
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>
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
これを試してみてください: 以下のコードをバッファに入れてからソースにします ( :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_