在Vim中将行合并到段落

toe95027  于 8个月前  发布在  其他
关注(0)|答案(4)|浏览(106)

我有以下文本与许多行.连续行是一个段落的一部分.但由一个空行分隔的行是单独段落的一部分.因此,以下文本有行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.


谢谢你的帮忙。

r1wp621o

r1wp621o1#

这一个工作(非常类似于曼努埃尔施密特的答案):

:%s/[^\n]\zs\n\ze[^\n]//

字符串
一些解释:

  • 将被删除的内容保持在\zs\ze之间(回车\n
  • [^\n]表示:* 除了回车符以外的任何字符 *

因此,该命令的意思是:* 请删除回车符,但仅当它位于两个非回车字符之间时 *

编辑:一个更好的解决方案从melpomene:

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

oxosxuxt

oxosxuxt2#

考虑到这是一个Vim问题,这里有一个vim答案(与RegEx答案相对)。
每一行代码块都被Vim视为一个段落,所以你可以在段落的任何地方输入:

vipgJ

字符串
这将可视地选择段落(vip)并连接所有行,而不添加或删除空格(gJ)。
这里有一种方法来创建一个宏,它连接当前段落,然后移动到下一个段落,准备再次运行:

qqvipgJjjq


现在用@q运行这个宏。如果你知道你想运行它多少次,你可以用5@q作为前缀,或者只是输入一个巨大的数字来应用它到文档的其余部分。
一个很酷的技巧是,你甚至可以编写一个宏来递归调用它自己。它会一直调用它自己,直到它不再做任何改变-在这种情况下,当它到达文档的末尾时(在开始之前确保你的q寄存器是空的,否则你会在编写新宏的时候应用现有的宏-你可以通过输入qqq来清除它):

qqvipgJjj@qq@q


说明:

  • qq:开始将宏记录到寄存器“q”中。
  • vipgJ:连接当前段落。
  • jj:向下移动两行到下一段。
  • @q运行宏“q”(录制时不做任何事情,因为寄存器“q”为空)。
  • q:停止录制宏。
  • @q:运行宏。
jhiyze9q

jhiyze9q3#

:%s/\([^\n]\)\n\([^\n]\)/\1\2/g

字符串
做的工作。
这里使用的是替换组。

  • 非新行字符(稍后用\1打印)
  • 新行字符(后来被省略)
  • 非新行字符(稍后用\2打印)
fafcakar

fafcakar4#

另一个更简单的正则表达式解决方案可以是:

:%s/\n\n\zs\|\n//g

字符串

**说明:**第一部分\n\n只匹配每一段的结尾,然后\z s超越这个匹配,然后\n匹配剩下的单行

相关问题