Как мне соединить две строки в vi?


169

У меня есть две строки в текстовом файле, как показано ниже:

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

Я хочу добавить две строки в vi, как показано ниже:

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

Вторая строка была удалена, и содержимое второй строки было добавлено к первой строке.

Как я могу сделать это, используя командный режим в vi?

Ответы:


310

Shift+ Jудаляет символ изменения строки из текущей строки, поэтому, нажав «J» в любом месте строки, вы можете комбинировать текущую строку и следующую строку по своему усмотрению.


9
верхний регистр J соединяет строки, нижний регистр перемещает курсор

4
Это была заглавная буква J, а не строчная буква J; отсюда Shift-J.
Джонатан Леффлер

28
«удаляет символ изменения строки из текущей строки» - довольно неловкий способ описать, что делает J, и он также не совсем корректен. J «присоединяет» эту строку к следующей. В процессе он удаляет символ новой строки, но также манипулирует пробелами другими способами.
Лоуренс Гонсалвес

5
Ха - ха. GJin vimпереместится на последнюю строку, а затем попытается присоединить ее к следующей строке, единственное место, где команда объединения не имеет смысла. Да, я нашел это забавным :-)
Alok Singhal

2
Я до сих пор не могу понять, что мне нужно было перейти на StackOverflow, чтобы объединить две строки с помощью этого редактора!
Манитра Андриамитондра

59

Ви или Вим?

В любом случае, следующая команда работает для Vim в режиме 'nocompatible'. То есть, я полагаю, почти чистый vi.

:join!

Если вы хотите сделать это из обычного использования команды

gJ

С 'gJ' вы объединяете строки как есть - без добавления или удаления пробелов:

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

Результат:

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

С помощью команды «J» вы получите:

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

Отметьте пробел между type>и _ID.


2
Сразу хочу отметить, что g/pattern/joinработает в VIM, пока g/pattern/Jнет. Может помочь некоторым будущим людям.
Jisaacstone

Мне нравится ваше соединение с шаблоном, однако, оно объединяет две строки с пробелами. В любом случае объединить две строки с шаблоном без пробелов?
David.Chu.ca

г / образец / присоединяйтесь! кажется, делает это.
Fortunboise

1
Может быть сложнее, пожалуйста! :-)
Йоханнес Оверманн

22

Это должно сделать это:

J


6
«J» дает дополнительное пространство при соединении линий.
Максим Ким

3
@MaximKim: И вот почему . Обратите внимание, что :h Jвы узнаете, как отключить эту функцию.
ereOn

2
Используйте, gJесли вы не хотите, чтобы vim добавлял пробел при соединении строк
qwertzguy

17

В vi J(это Shift+ J) или :joinследует делать то, что вы хотите, по большей части. Обратите внимание, что они корректируют пробелы.В частности, во многих случаях вы получите пробел между двумя соединенными строками, и если вторая строка имеет отступ, отступ перед удалением будет удален.

В Vim вы также можете использовать gJ( G, затем Shift+ J) или :join!. Они будут объединять строки без каких-либо корректировок пробелов.

В Vim, смотрите :help Jдля получения дополнительной информации.


Одно предостережение при использовании gJи Jзаключается в том, что оба меняют курсор на точку соединения, но :join!и :joinне делают.
SergioAraujo

4

Просто замените " \n" на "".

В vi / Vim для каждой строки в документе:

%s/>\n_/>_/g

Если вы хотите подтвердить каждую замену:

%s/>\n_/>_/gc

3

Если вы хотите объединить выбранные строки (вы находитесь в визуальном режиме), просто нажмите, gJчтобы объединить свои строки без пробелов.

Более подробно это описано на сайте vi / Vim Stack Exchange .


1

Нажмите Shift+ 4("$") в первой строке, затем Shift+ j("J").

А если вам нужна помощь, зайдите в vi, а затем нажмите F1.


3
$ перемещается в конец строки, но это не обязательно для J

1
Вам не нужно быть в конце строки, чтобы J присоединился к ней.
Джонатан Леффлер

1
На самом деле нажатие $ не обязательно.
Лоуренс Гонсалвес

1
@laurence .pressing $ гарантирует, что курсор находится рядом с новой строкой хартии, и это необходимо.
Виджай


1

Другой способ объединения двух строк без наведения курсора на эту строку:

:6,6s#\n##

Здесь 6 - номер строки, к которой будет присоединена другая строка. Для отображения номера строки используйте :set nu.

Если мы находимся на курсоре, где должна быть соединена следующая строка, то:

:s#\n##

В обоих случаях нам не нужно gподобное :s#\n##g, потому что на одной строке \nсуществует только одна .


Проще использовать, Shift+Vчтобы выбрать все строки, которые нужно соединить, кроме последней, а затем :'<,'>s/\n/, /в этом примере объединять строки, помещая запятую и пробел в конце каждой. Обратите внимание, что когда что-то выбрано и мы набираем текст :в обычном режиме, оно '<,'>появляется в командной строке автоматически.
Евгений Сергеев

Подходит для выбранного многострочного соединения с предпочтительным разделителем. Нашли одну опечатку ... в обычном режиме или в визуальном режиме?
Вусан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.