2012-10-04 15 views
10

È possibile sostituire un'espressione regolare con un numero generato in modo casuale in Vim? Il numero (casuale) da sostituire dovrebbe essere diverso per ogni modello che corrisponde all'espressione regolare. Ecco un esempio di ciò di cui ho bisogno.Vim sostituire un Regex con numeri generati casualmente

Input File:

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

Dopo sostituendo XYZ con numeri casuali, l'uscita potrebbe essere:

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

risposta

18

Se non ti dispiace un po 'di perl nel vostro vim, è possibile utilizzare

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

Edit: aggiornato per permettere sostituzioni illimitate su una linea, per suggerimento di @ hobbes3, quindi

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

diventa qualcosa di simile

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

Grazie! È così semplice! Non sapevo che potresti eseguire direttamente perl da vim. – krjampani

+2

È possibile eseguire * qualsiasi * all'interno di vim. Vedere http://www.commandlinefu.com/commands/view/1204/save-a-file-you-edited-in-vim-without-the-needed-permissions per un esempio particolarmente utile. –

+0

Will che generano un nuovo int casuale per ogni linea o lo fa basta usare un singolo int casuale? –

5

Prova questo: inserire il codice sottostante per un buffer poi fonte esso (: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 

allora si può fare:

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

Solo per riferimento questo non è casuale. Ma per il caso d'uso è abbastanza buono. – Sukima