如何在每个非空行之间插入一个空行?
例如来自
line 1
line 2
line 3
line 4
line 5
到
line 1
line 2
line 3
line 4
line 5
答案1
其他做法是:
:%s/$/\r/g
$
是行尾
\r
添加新行
g
全局执行而不仅仅是第一次出现
但这也会在空白行之间添加一行
答案2
Vim 的 :g 命令就是为这类任务而设计的;对与特定模式匹配的每一行运行单个操作。以下是我的答案:
:g/.\n\n\@!/norm o
我使用的模式是/.\n\n\@!/
。将其分解成各个组成部分:
.
匹配行中的任意字符。(用于立即丢弃任何现有的空行)\n
匹配上述字符末尾的单个 \n\n\@!
如果在先前的 \n 之后立即有另一个 \n,则匹配失败。
(检查:h E59
有关\@!
正则表达式中的类似匹配说明符的更多信息 - 还有其他几个!)
因此,:g 命令的正则表达式现在已经选择了每个以单个换行符终止且后面没有空行的非空行。
语句中的模式之后:g
是匹配行上运行的命令。在本例中,我告诉它执行正常模式命令(缩写为norm
),运行的命令就是o
,它在当前行下方插入一个空行。
所以综合起来,该命令会找到每一行下面没有空行的行,并添加一行。这就是它的全部内容!您可能想查看 vim wiki 的G的力量文章中介绍了您可以使用的更多奇特的东西:g
(以及它的负面姐妹:v
),它是那些非常有用的命令之一,您很快就会依赖它,然后在没有它的编辑器中非常怀念它。
答案3
当我测试@NeilForester的全局搜索和替换答案时,我发现如果每行只有一个字符,它会错过连续非空白行中的每一秒预期替换。这似乎是由于模式每次都开始匹配后与前一次匹配的最后一个字符。
使用后视和前视解决了这个问题,并使正则表达式变得更短一些:
:%s/\n\@<!\n\n\@!/\r\r/g
答案4
如果我错了,请纠正我。我相信您在命令模式下使用字母 k 向下移动一行。然后进入插入模式并添加下一行。必要时重复?希望这有帮助!