Как да съединявам линии с добавяне на разделител?

Командата J съединява редове.
Командата gJ съединява редове, премахвайки интервали

Има ли и команда за свързване на редове, добавяща разделител между редовете?

Пример:

Вход:

text
other text
more text
text

Какво искам да направя:
- изберете тези 4 реда
- ако има интервали в началото и/или EOL ги премахнете
- съединете редовете, като добавите разделител '//' между тях

Резултат:

text//other text//more text//text

person Reman    schedule 08.08.2014    source източник


Отговори (5)


Можете да използвате :substitute за това, съпоставяне на \n:

:%s#\s*\n\s*#//#g

Това обаче добавя разделителя и в края (тъй като последният ред в диапазона също има нов ред). Можете да премахнете това ръчно или да посочите флага c и да прекратите заместването преди последното, или да намалите обхвата с едно и вместо това да :join последното:

:1,$-1s#\s*\n\s*#//#g|join
person Ingo Karkat    schedule 08.08.2014
comment
+1 - Опитвах нещо като 1,$-1norm A//|join, но някак си не работи. Добавя присъединяването към? Случайно да знаеш защо? Заради нормалната команда ли е? (забележка: има бягство между // и |, но се изгуби в коментара) - person Lieven Keersmaekers; 08.08.2014
comment
@LievenKeersmaekers: Трябва да увиете :norm A в :execute; cp. :h :bar - person Ingo Karkat; 08.08.2014
comment
Уау красиво решение. Благодаря ти Инго. - person Reman; 08.08.2014
comment
@Remonn, използвах #, за да избегна нуждата да избягвам замяната на // като \/\/. - person Ingo Karkat; 08.08.2014

Написах плъгин „Присъединете се“, можехте да правите каквото искате и още.

https://github.com/sk1418/Join

С изключение на всички функции, предоставени от вградената команда :join, Присъединяване може:

Join lines with separator (string)
Join lines with or without trimming the leading/trailing whitespaces
Join lines with negative count (backwards join)
Join lines in reverse
Join lines and keep joined lines (without removing joined lines)
Join lines with any combinations of above options

проверете началната страница за подробности и примери/екранни снимки.

person Kent    schedule 08.08.2014

Има няколко начина да го направите, но бих препоръчал да преминете по възможно най-простия път - запис на макрос или изпълнение на многоетапна команда, например чрез:

Добавяне към всички редове, с изключение на последния от

  • Използване на заместване (:1,$-1s#$#//#)
  • Добавяне (:1,$-1norm A//)

И след това се присъединете чрез визуална селекция (vGgJ) или по друг метод.

Освен ако не правите тази операция много често, най-вероятно ще забравите всички сложни команди или съществуването на специализиран плъгин във вашата конфигурация, поради което моята препоръка е да използвате общи, често използвани подстъпки.

person XLII    schedule 08.08.2014

Друга замяна, в името на разнообразието:

:%s:\n\ze.://
person romainl    schedule 08.08.2014

Ще изброи 50 елемента на ред, разделени с интервали:

seq 0 70 | xargs -L 50 | sed 's/ /,/g'

Изход:

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49
50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70
person jmunsch    schedule 24.10.2016