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_