vim - 将行合并到 vim 中的段落

我有以下多行文字。连续的行是一个段落的一部分。但是由空行分隔的行是单独段落的一部分。因此,以下文本有 2 个段落的行:

first group of lines.
first group of lines.
first group of lines.
first group of lines.
first group of lines.
first group of lines.

second group of lines. 
second group of lines. 
second group of lines. 
second group of lines. 
second group of lines. 
second group of lines. 

我正在使用以下代码将连续的行合并为段落:

%s/\n\n\@!//g

结果是:

first group of lines.first group of lines.first group of lines.first group of lines.first group of lines.first group of lines.
second group of lines. second group of lines. second group of lines. second group of lines. second group of lines. second group of lines. 

因此形成了段落,但它们没有被空行分隔。如果我再次运行我的命令,这些也将合并为一个段落。如何修改我的代码以在新制作的段落之间保留一个空行,以便输出如下:

first group of lines.first group of lines.first group of lines.first group of lines.first group of lines.first group of lines.

second group of lines. second group of lines. second group of lines. second group of lines. second group of lines. second group of lines. 

感谢您的帮助。

最佳答案

考虑到这是一个 vim 问题,这里有一个 vim 答案(与 RegEx 答案相反)。

vim 将每一行视为一个段落,因此您可以从段落中的任何位置输入:

vipgJ

这会直观地选择段落 (vip) 并在不添加或删除空格的情况下连接所有行 (gJ)。

这是一种创建宏的方法,它连接当前段落,然后移动到下一个段落,准备再次运行:

qqvipgJjjq

现在使用 @q 运行宏。如果您知道要运行它多少次,您可以使用该数字作为前缀 5@q,或者只输入一个大数字以将其应用于文档的其余部分。

对于一个非常酷的技巧,您甚至可以编写宏来递归调用自身。它会一直调用自己,直到它不再进行更改 - 在这种情况下,当它到达文档末尾时(确保您的 q 寄存器在开始之前为空,否则您将应用现有的宏在编写新的时 - 你可以通过键入 qqq 来清除它):

qqvipgJjj@qq@q

解释:

  • qq:开始将宏记录到寄存器“q”中。
  • vipgJ:加入当前段落。
  • jj:向下移动 2 行到下一段。
  • @q 运行宏“q”(录制时什么都不做,因为寄存器“q”为空)。
  • q:停止录制宏。
  • @q:运行宏。

https://stackoverflow.com/questions/43709363/

相关文章:

c# - Unity Particle Collider 与粒子

r - 在 shinyapps.io 中部署 R 应用程序 - "Error:parsing man

angular - HTML5 Websql - 如何与 Ionic 3 和 Angular 4 一

php - 当要比较的元数据是序列化数组时,Wordpress meta_query 值数组?

django - 值错误 : Cannot use Queryset for "": Use a Q

qt - 对 `dlsym' 的 undefined reference

json - JSON 模式中的变量对象名称

arrays - Swagger 的对象数组

linux - 错误 "caution: filename not matched"- 解压缩命令

perl - 在 Perl 中打印哈希值