Jak połączyć dwie linie w vi?

169

Mam dwie linie w pliku tekstowym, jak poniżej:

S<Switch_ID>_F<File type>
_ID<ID number>_T<date+time>_O<Original File name>.DAT

Chcę dołączyć dwie linie do vi, jak poniżej:

S<Switch_ID>_F<File type>_ID<ID number>_T<date+time>_O<Original File name>.DAT

Druga linia została usunięta, a zawartość drugiej linii została dołączona do pierwszej.

Jak mogłem to zrobić używając trybu poleceń w vi?

Vijay
źródło

Odpowiedzi:

310

Shift+ Jusuwa znak zmiany linii z bieżącej linii, więc naciskając "J" w dowolnym miejscu w linii możesz łączyć bieżącą i następną linię w dowolny sposób.

GJ.
źródło
9
wielkie litery J łączy linie, małe litery przenoszą kursor
4
To było duże J, a nie małe J; stąd Shift-J.
Jonathan Leffler,
28
„usuwa znak zmiany linii z bieżącej linii” jest dość niewygodnym sposobem opisania tego, co robi J, i nie jest też do końca poprawne. J „łączy” tę linię z następną. W tym procesie usuwa znak nowej linii, ale także manipuluje białymi znakami w inny sposób.
Laurence Gonsalves,
5
Ha ha. GJin vimprzeniesie się do ostatniej linii, a następnie spróbuje dołączyć do następnej linii, jedyne miejsce, w którym polecenie join nie ma sensu. Tak, wydało mi się to zabawne :-)
Alok Singhal,
2
Nadal nie mogę zdać sobie sprawy, że musiałem przejść do StackOverflow, aby połączyć dwie linie za pomocą tego edytora!
Manitra Andriamitondra,
59

Vi czy Vim?

W każdym razie, poniższe polecenie działa dla Vima w trybie „nocompatible”. To znaczy, jak przypuszczam, prawie czyste vi.

:join!

Jeśli chcesz to zrobić z normalnego polecenia, użyj

gJ

Za pomocą `` gJ '' łączysz wiersze tak, jak jest - bez dodawania lub usuwania białych znaków:

S<Switch_ID>_F<File type>
_ID<ID number>_T<date+time>_O<Original File name>.DAT

Wynik:

S<Switch_ID>_F<File type>_ID<ID number>_T<date+time>_O<Original File name>.DAT

Z komendą 'J' będziesz miał:

S<Switch_ID>_F<File type> _ID<ID number>_T<date+time>_O<Original File name>.DAT

Zwróć uwagę na odstępy między type>a _ID.

Maxim Kim
źródło
2
Chcę tylko zaznaczyć, że g/pattern/joindziała w VIM, a g/pattern/Jnie. Może pomóc niektórym przyszłym ludziom.
jisaacstone
Podoba mi się twoje połączenie ze wzorem, jednak łączy dwie linie z białą spacją. Zresztą, aby połączyć dwie linie wzorem bez spacji?
David.Chu.ca
g / wzór / dołącz! wydaje się, że to robi.
fortboise
1
Czy to może być bardziej skomplikowane? :-)
Johannes Overmann
22

To powinno wystarczyć:

J

samg
źródło
6
„J” daje dodatkową przestrzeń podczas łączenia linii.
Maxim Kim
3
@MaximKim: I dlatego . Zauważ, że :h Jpowie Ci, jak wyłączyć tę funkcję.
ereOn
2
Użyj, gJjeśli nie chcesz, aby
Vim
17

W vi, J(to jest Shift+ J) lub :joinpowinno robić, co chcesz, w większości. Zauważ, że dostosowują białe znaki. W szczególności w wielu przypadkach będziesz miał spację między dwoma połączonymi wierszami, a jeśli druga linia zostanie wcięta, to wcięcie zostanie usunięte przed połączeniem.

W Vimie możesz także użyć gJ( G, a następnie Shift+ J) lub :join!. Będą one łączyć linie bez dokonywania jakichkolwiek zmian w postaci białych znaków.

W Vimie zobacz, :help Jaby uzyskać więcej informacji.

Laurence Gonsalves
źródło
Jedynym zastrzeżeniem podczas używania gJi Jjest to, że oba zmieniają kursor na punkt łączenia, ale :join!i :joinnie.
SergioAraujo
4

Po prostu zamień „ \n” na „”.

W vi / Vim dla każdej linii w dokumencie:

%s/>\n_/>_/g

Jeśli chcesz potwierdzić każdą wymianę:

%s/>\n_/>_/gc
Carsten C.
źródło
3

Jeśli chcesz dołączyć do wybranych linii (jesteś w trybie wizualnym), po prostu naciśnij, gJaby połączyć linie bez żadnych spacji.

Jest to opisane bardziej szczegółowo na stronie vi / Vim Stack Exchange .

Brad Parks
źródło
1

Naciśnij Shift+ 4(„$”) w pierwszym wierszu, a następnie Shift+j („J”).

Jeśli potrzebujesz pomocy, przejdź do vi, a następnie naciśnij F1.

ghostdog74
źródło
3
$ przenosi się na koniec wiersza, ale nie jest to konieczne dla J
1
Nie musisz znajdować się na końcu linii, aby J dołączył do linii.
Jonathan Leffler
1
W rzeczywistości naciśnięcie $ nie jest konieczne.
Laurence Gonsalves,
1
@laurence. naciśnięcie $ zapewnia, że ​​kursor zostanie umieszczony tuż obok nowego schematu linii i jest to konieczne.
Vijay
1

W Vimie możesz również użyć gJ.

ََ

joshy
źródło
1

Innym sposobem na połączenie dwóch linii bez umieszczania kursora w tej linii jest:

:6,6s#\n##

Tutaj 6 to numer linii, do której zostanie dołączona inna linia. Aby wyświetlić numer linii, użyj :set nu.

Jeśli jesteśmy na kursorze w miejscu, w którym ma zostać dołączona następna linia, to:

:s#\n##

W obu przypadkach nie potrzebujemy gpolubień :s#\n##g, ponieważ w jednej linii \nistnieje tylko jeden .

vusan
źródło
Łatwiej jest Shift+Vzaznaczyć wszystkie wiersze, które mają zostać połączone, z wyjątkiem ostatniego, a następnie :'<,'>s/\n/, /w tym przykładzie łączyć wiersze z przecinkiem i spacją na końcu każdego. Zwróć uwagę, że gdy coś jest zaznaczone i piszemy :w trybie normalnym, '<,'>w wierszu poleceń pojawia się automatycznie.
Evgeni Sergeev
Dobre dla wybranych złączeń wielowierszowych z preferowanym separatorem. Znalazłeś jedną literówkę ... w trybie normalnym czy w trybie wizualnym?
vusan