2012-09-18 13 views
17

Ho un file con queste righe:Duplicate ogni riga in VI

aa 
bb 
cc 
dd 

voglio convertire questo in:

aa 
aa 
bb 
bb 
cc 
cc 
dd 
dd 

Questo è possibile in VI?

+0

Probabilmente di interesse per molte persone che arrivano qui: http://stackoverflow.com/q/29368158/812102 –

+0

Usa Tizio atomo !! :). Puoi farlo con Cmd + Shift + D (o Ctrl + Shift + D) –

risposta

32

Provate questo semplice:

:g/^/norm yyp 

Ancora un altro (più breve):

:%s/.*/&\r& 

Un altro:

:%!sed p 
+0

Grazie. Ha funzionato. – arunmoezhi

+0

Grazie per l'opzione s, perché stavo cercando di fare questo per una selezione visiva e questo ha funzionato per me. – mmarchin

9

Utilizzare il comando globale g di operare ogni riga nel file:

:g/^/norm yyp 

Il comando g funziona su tutte le linee che corrispondono a un modello. ^ è uno schema che corrisponderà a qualsiasi linea. norm esegue il comando yyp, che copia la linea corrente e la incolla. :g/^/norm Yp funzionerà anche.

Vedere :help global per ulteriori dettagli sul comando e vedere anche questa pagina vim wiki su g.

+1

Grazie per la spiegazione – arunmoezhi

+0

O semplicemente ':% norm Yp' – Conner

+2

@Conner: Non funziona, in quanto% scorre sull'intervallo originale, ma il comando aggiunge linee. Hai bisogno della logica "contrassegna prima, poi itera" di ': global' qui. –

31

mi piace g/^/t.
Il comando g (per global) cercherà tutte le righe che corrispondono a un modello.
Il modello specificato è ^, che corrisponderà a tutte le linee.
t copia e incolla e infine
il dot indica di incollare di seguito.

Vince per brevità?

+0

+1 Troppi modi. Questo è il più corto, immagino. – kev

+0

Grazie per la risposta. Ho svalutato lo – arunmoezhi

+1

questo è quello che di solito uso – sehe

Problemi correlati