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>

Ответ 1

Если вы не против немного perl в своем vim, вы можете использовать

:%! 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

Ответ 2

Попробуйте: поставьте ниже код в буфер, затем введите его (: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_