Answers:
Vim的:g命令专门用于此类任务。在与特定模式匹配的每一行上执行单个操作。这是我的答案:
:g/.\n\n\@!/norm o
我使用的模式是/.\n\n\@!/
。将其分解为几个组成部分:
.
匹配行中的任何字符。(用于立即丢弃考虑中的任何现有空行)\n
在上述字符的末尾匹配一个\ n\n\@!
如果较早的\ n后面紧接着另一个\ n,则匹配失败。(在正则表达式中检查:h E59
有关更多信息\@!
以及类似的匹配说明符的信息-还有其他几个!)
因此,:g命令的正则表达式现在选择了每个非空行,这些非空行以单个换行符终止,并且后面没有空行。
:g
语句中的模式出现后,命令将在匹配的行上运行。在这种情况下,我已经告诉它执行普通模式命令(缩写为norm
),运行的命令就是o
,它会在当前行下方插入一个空行。
综上所述,该命令查找下面没有空行的每一行,并添加一行。这就是全部!您可能想查看一下Vim Wiki的Power of G文章,了解可以使用的更多奇特的东西:g
(它是负面的姐妹,:v
)-这是那些令人难以置信的有用命令之一,您很快就会依赖它,然后在编辑器中大失所望没有它。
:%s/$/
,然后点击^V
,然后点击Enter
。
:%s/$/<C-V><CR><CR>
(使用按键的常见vim-folk编码),则此方法仅在每行之后添加一个换行符。也就是说,已经由空格分隔的行(请参见示例文本中的第3行->第4行)最终会获得多余的空行。最初的问题是避免在起始文本中已经存在的地方添加多余的空白行。
当我测试@NeilForester的全局搜索和替换答案时,我发现如果连续的每行中只有一个字符,它将错过连续的非空白行中的每秒钟预期的替换。这似乎是由于该模式在与上一个场合相匹配的最后一个字符之后每次都开始匹配。
使用lookbehind和lookahead解决了此问题,并使正则表达式也更短:
:%s/\n\@<!\n\n\@!/\r\r/g
\n\@<!\n
意味着不正确的换行符是否正确?但我不明白这\n\@!
意味着什么。我想了解它,所以我可以学习并将其应用于其他搜索模式:)
\n\@<!\n
表示没有立即跟在另一个换行符之后的任何换行符。\n\@!
如果前面的原子(即\n
)与后面的原子不匹配,则宽度为零。尝试:help \@<!
在vim中查看有关此文档。我
/[^\n]\n[^\n]
:map <F2> no<esc><F2>
然后按<F2>
。这将搜索两个连续的非空白行,然后在它们之间重复添加一条线。
编辑:
这是通过单个全局搜索和替换来完成此操作的另一种方法:
:%s/\([^\n]\)\n\([^\n]\)/\1\r\r\2/g
:%norm o
但事实证明,这种方法在情况下不符合预期o
。+1