2012-09-18 13 views
17

Tengo un archivo con estas líneas:duplicado en cada línea VI

aa 
bb 
cc 
dd 

quiero convertir esto en:

aa 
aa 
bb 
bb 
cc 
cc 
dd 
dd 

Es esto posible en VI?

+0

Probablemente de interés para mucha gente que llega aquí: http://stackoverflow.com/q/29368158/812102 –

+0

¡Utiliza atom dude !! :). Puedes hacerlo con Cmd + Shift + D (o Ctrl + Shift + D) –

Respuesta

32

Prueba esta sencilla:

:g/^/norm yyp 

Sin embargo, otro (más corto):

:%s/.*/&\r& 

Otra:

:%!sed p 
+0

Gracias. Funcionó. – arunmoezhi

+0

Gracias por la opción s, porque estaba buscando hacer esto para una selección visual y eso funcionó para mí. – mmarchin

9

Uso del comando globalg para operar en cada línea en el archivo:

:g/^/norm yyp 

El comando g funcionará en todas las líneas que coinciden con un patrón. ^ es un patrón que coincidirá con cualquier línea. norm ejecuta el comando yyp, que tira de la línea actual y la pega. :g/^/norm Yp también funcionará.

Consulte :help global para obtener más información sobre el comando, y consulte también esta página vim wiki en g.

+1

Gracias por la explicación – arunmoezhi

+0

O simplemente ':% norma Yp' – Conner

+2

@Conner: Eso no funciona, ya que% itera sobre el rango original, pero el comando agrega líneas. Necesitas la lógica "marca primero, luego itera" de ': global' aquí. –

31

me gusta g/^/t.
El comando g (por global) buscará las líneas que coinciden con un patrón.
El patrón que especificamos es ^, que coincidirá con todas las líneas.
t copiará y pegará, y finalmente
el dot le dice que pegue a continuación.

¿Puedo ganar brevedad?

+0

+1 Demasiadas maneras. Este es el más corto, supongo. – kev

+0

Gracias por la respuesta. Lo voté – arunmoezhi

+1

esto es lo que generalmente uso – sehe