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?

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.


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.


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


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.


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


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.


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

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 .


Ł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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.