2012-09-18 14 views
17

Mam plik z tych linii:Duplikat każda linia w VI

aa 
bb 
cc 
dd 

chcę przekonwertować to do:

aa 
aa 
bb 
bb 
cc 
cc 
dd 
dd 

Jest to możliwe w VI?

+0

Prawdopodobnie interesujące dla wielu osób: http://stackoverflow.com/q/29368158/812102 –

+0

Użyj atomowego kolesia !! :). Możesz to zrobić za pomocą Cmd + Shift + D (lub Ctrl + Shift + D) –

Odpowiedz

32

Spróbuj proste:

:g/^/norm yyp 

jeszcze jeden (krótsza):

:%s/.*/&\r& 

inny:

:%!sed p 
+0

Dzięki. Zadziałało. – arunmoezhi

+0

Dzięki za opcję, ponieważ chciałem zrobić to dla wizualnej selekcji i to zadziałało dla mnie. – mmarchin

9

Użyj globalnego polecenia g do działania na każdy wiersz w pliku:

:g/^/norm yyp 

Polecenie g będzie działać na wszystkich liniach pasujących do wzorca. ^ to wzór, który będzie pasował do dowolnej linii. norm wykonuje polecenie yyp, które zrywa bieżący wiersz i wkleja go. :g/^/norm Yp będzie również działać.

Więcej informacji na temat polecenia można uzyskać pod adresem :help global. Zobacz także tę stronę vim wiki pod adresem g.

+1

Dzięki za wyjaśnienie – arunmoezhi

+0

Lub po prostu ':% norm Yp' – Conner

+2

@Conner: To nie działa, ponieważ% iteruje w oryginalnym zakresie, ale polecenie dodaje linie. Potrzebujesz tutaj "logika pierwszego, potem iteruj" ': global'. –

31

Lubię g/^/t.
Komenda g (dla global) będzie szukał wszelkich liniach pasujących do wzorca.
Podany wzór to ^, który będzie pasował do wszystkich linii.
t skopiuje i wklei, a na koniec
dot mówi, że należy wkleić poniżej.

Czy wygrywam dla zwięzłości?

+0

+1 Zbyt wiele sposobów. To chyba najkrótsza. – kev

+0

Dzięki za odpowiedź. Wzmocniłem to – arunmoezhi

+1

to jest to, z czego zwykle używam – sehe