Как соединить строки, добавив разделитель?

Команда 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; ср. :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 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