如何使用分隔符连接行?

5

命令J用于合并行。
命令gJ用于合并行并删除空格。

是否存在一种命令可以在行之间添加分隔符来合并行?

示例:

输入

text
other text
more text
text

我想要做的事情:
- 选择这4行
- 如果开头和/或结尾有空格,请删除它们
- 在它们之间添加分隔符“//”以合并这些行

输出:

text//other text//more text//text
5个回答

5
您可以使用:substitute命令,匹配\n即可实现该功能。
:%s#\s*\n\s*#//#g

然而,这个方法也会在末尾添加一个分隔符(因为范围内的最后一行也有一个换行符)。您可以手动删除它,或者指定c标志并在最后一个替换前退出,或者将范围减少一个并且代替最后一个使用:join

:1,$-1s#\s*\n\s*#//#g|join

+1 - 我尝试了类似于1,$-1norm A//|join的东西,但不知何故它不起作用。它会将join附加到哪里?你知道是为什么吗?是因为normal命令吗?(注意:在//和|之间有一个转义字符,但它在注释中丢失了) - Lieven Keersmaekers
1
@LievenKeersmaekers:你需要将 :norm A 包装在 :execute 中;参见 :h :bar - Ingo Karkat
哇,漂亮的解决方案。谢谢Ingo。 - Reman
@Remonn,我使用#来避免必须将//替换为\/\/ - Ingo Karkat

3
我写了一个名为“Join”的插件,可以完成你想要的功能,并且更多。

https://github.com/sk1418/Join

除了内置的: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

请查看主页以获取详细信息和示例/截图。

1
有几种方法可以实现,但我建议采用最简单的路线-例如记录宏或执行多步命令,比如:

通过以下方式将内容添加到除最后一行之外的所有行:

  • 使用替换(:1,$-1s#$#//#
  • 添加(:1,$-1norm A//

然后使用可视化选择(vGgJ)或其他任何方法进行连接。

除非您经常执行此操作,否则您很可能会忘记任何复杂命令或插件在您的配置中的存在,因此我建议使用通用的、经常使用的子步骤。


1
另一个替换,出于多样性考虑:

:%s:\n\ze.://

1

每行列出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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接