Как мне соединить две строки в 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

samg
источник
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.

ghostdog74
источник
3
$ перемещается в конец строки, но это не обязательно для J
1
Вам не нужно быть в конце строки, чтобы J присоединился к ней.
Джонатан Леффлер
1
На самом деле нажатие $ не обязательно.
Лоуренс Гонсалвес
1
@laurence .pressing $ гарантирует, что курсор находится рядом с новой строкой хартии, и это необходимо.
Виджай
1

В Vim вы также можете использовать gJ.

Джоши
источник
1

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

:6,6s#\n##

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

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

:s#\n##

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

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