Як з'єднати два рядки в 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

Другий рядок було видалено, а вміст другого рядка було додано до першого рядка.

Як я можу це зробити за допомогою командного режиму in vi?

Відповіді:


310

Shift+ Jвидаляє символ зміни рядка з поточного рядка, тому натисканням кнопки "J" в будь-якому місці рядка ви можете поєднати поточний і наступний рядок так, як вам потрібно.


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

4
Це був капітал J, а не малий J; звідси Shift-J.
Джонатан Леффлер

28
"вилучає символ зміни рядка з поточного рядка" - це досить незручний спосіб описати те, що робить J, а також насправді не правильно. J "приєднується" до цього рядка до наступного. У процесі він видаляє новий рядок, але також маніпулює пробілом іншими способами.
Лоранс Гонсалвс

5
Ха-ха. GJin vimперейде до останнього рядка, а потім спробує приєднати його до наступного рядка, єдине місце для команди приєднання не має сенсу. Так, мені це було смішно :-)
Алок Сінгал

2
Я досі не можу зрозуміти, що мені потрібно перейти на StackOverflow, щоб з'єднати два рядки за допомогою цього редактора!
Манітра Андріамітондра

59

Vi чи Vim?

У будь-якому разі наступна команда працює для Vim у режимі "несумісного". Тобто, я гадаю, майже чистий 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

г / шаблон / приєднуйтесь! здається, це роблять.
fortboise

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" на "".

In 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/, /у цьому прикладі з'єднувати рядки, ставлячи кому та пробіл у кінці кожного. Зауважте, що коли щось вибрано і ми набираємо :в звичайному режимі, то '<,'>в командному рядку відображається автоматично.
Євгеній Сергеєв

Добре підходить для вибраного декількох ліній з’єднання з бажаним роздільником. Знайшли одну друкарську помилку ... у звичайному режимі чи у візуальному режимі?
vusan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.