使用Vim删除单行换行符但保留空行

5

在Vim中,有没有可能去掉单行换行符,但保留空行(我猜是双行换行符)?我正在使用Vim的HardPencil插件进行一些文字处理,我喜欢硬换行符,因为它使文件更容易跳转。然而,我需要在LibreOffice Writer或Word中共享这些信息,如果其他人编辑该文件,则硬换行符将无法很好地工作。澄清一下,这就是我目前拥有的:

Line1.
Line2.
Line3.

Line4.
Line5.

这是我需要的内容:

Line1. Line2. Line3.

Line4. Line5.

基本上,硬回车应该被替换为一个空格,而双倍回车应该被保留。
我尝试了各种变化的 :%s/\n 但无法保留双倍换行符。我在这里找到了类似的问题herehere,但这些问题并不特定于 Vim。
2个回答

6
你可以将line+line break替换为只有line,并使用负向预查\(\n\)\@!来确保它后面不是空行。
:%s/\(.\+\)\n\(\n\)\@!/\1 /

@Peter_Rincker的更简洁的解决方案:

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

我认为这非常接近。Line1. Line2. Line3.都适当地出现在同一行上,就像Line4. Line5.一样,但是两者之间的空行已经被合并了。 - haff
那么,我想我可以在每个换行符后添加一个空行? - haff
@haff,我错过了那个。我猜你可以在这里使用负向先行断言,但是正则表达式会变得有点复杂。 - Fabricator
我们可以通过使用\zs\ze来使阅读更加容易,而不需要使用负面环视。作为额外奖励,它也更短。例如::%s/.\+\zs\n\ze./ / - Peter Rincker
@PeterRincker,哇,我之前不知道\zs \ze。非常有用。谢谢。 - Fabricator

5

使用 gw(或 gq)与运动一起使用(例如 G)。

gwG

gw是Vim的段落格式化操作符,它可以“重新排版”文本以达到所需的'textwidth'。您可能希望将'textwidth'暂时设置为0以获得无限文本宽度(:set tw=0)。

还有其他一些方法也可以实现此目的:

  • 使用:%!fmt - 与上述方法相同,但使用了外部工具和过滤器fmt
  • :v/^$/,//-j - 将非空行挤在一起。如果范围的末尾没有空行,则失败。
  • :g/\v(.+\zs\n)+/,-//j - 也将非空行挤在一起,但避免了先前方法的范围错误。
  • 替换 - 例如,参见@Fabricator的解决方案。

要获取更多帮助,请参见:

:h gw
:h operator
:h 'tw'
:h filter
:h :range!
:h :range
:h :v
:h :j
:h :g
:h magic
:h /\zs

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