Vim-在行之间添加空行


15

如何在每条非空白行之间插入空白行?

例如。从

line 1
line 2
line 3

line 4
line 5

line 1

line 2

line 3

line 4

line 5

Answers:


27

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)-这是那些令人难以置信的有用命令之一,您很快就会依赖它,然后在编辑器中大失所望没有它。


1
精确地 我通常会寻找速记,:%norm o但事实证明,这种方法在情况下不符合预期o。+1
sehe

键入:%s/$/,然后点击^V,然后点击Enter
jpaugh

1
@jpaugh假设您的意思是:%s/$/<C-V><CR><CR>(使用按键的常见vim-folk编码),则此方法仅在每行之后添加一个换行符。也就是说,已经由空格分隔的行(请参见示例文本中的第3行->第4行)最终会获得多余的空行。最初的问题是避免在起始文本中已经存在的地方添加多余的空白行。
Trevor Powell,

3

当我测试@NeilForester的全局搜索和替换答案时,我发现如果连续的每行中只有一个字符,它将错过连续的非空白行中的每秒钟预期的替换。这似乎是由于该模式在与上一个场合相匹配的最后一个字符之后每次都开始匹配。

使用lookbehind和lookahead解决了此问题,并使正则表达式也更短:

:%s/\n\@<!\n\n\@!/\r\r/g

谢谢!这有效,并且如果我再次运行搜索,它不会添加更多行(例如,我在文件中添加了新行)。

1
您能否解释一下搜索模式中的每个正则表达式是什么意思?查看vim帮助,\n\@<!\n意味着不正确的换行符是否正确?但我不明白这\n\@!意味着什么。我想了解它,所以我可以学习并将其应用于其他搜索模式:)

是的,\n\@<!\n表示没有立即跟在另一个换行符之后的任何换行符。\n\@!如果前面的原子(即\n)与后面的原子不匹配,则宽度为零。尝试:help \@<!在vim中查看有关此文档。我
西蒙(Simon)

3

另一种方式:

%s/\(.\)\n\(.\)/\1\r\r\2/

意思是,

\(.\) match and capture a non-newline character,
\n    match a newline
\(.\) match and capture a non-newline character

替换为:第一个捕获,双换行符和第二个捕获。

例如,line1\nLine2结果为\1 = 1\2 = L


0

如果我错了,请纠正我。我相信您在命令模式下使用字母k向下移动一行。然后进入插入模式并添加下一行。根据需要重复吗?希望这可以帮助!


k向上移动一条线。j下移一条线。
尼尔·弗雷斯特

是的,确实如此。我的错。谢谢尼尔!

0
/[^\n]\n[^\n]
:map <F2> no<esc><F2>

然后按<F2>。这将搜索两个连续的非空白行,然后在它们之间重复添加一条线。

编辑:

这是通过单个全局搜索和替换来完成此操作的另一种方法:

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

我的文件有很多行。有没有办法进行正则表达式搜索并为整个文件插入空白行?我一直在看stackoverflow.com/questions/2673209/…但无法理解所有正则表达式命令的含义。

请参阅我上面的编辑,以了解在一个命令中无需递归映射即可完成同一件事的另一种方法。第一种方法应该适用于整个文件。
尼尔·佛雷斯特

0

尝试以下命令(个16字符):

:%!sed G|cat -s

与其尝试“ vimgolf”一个简短的命令,不如对所用的晦涩难懂的选项进行一点解释会更有帮助。
Ingo Karkat

0

我不知道您的文件有多长时间,但最简单的方法之一是o在命令模式下键入。然后在下一行.。这可以加载到简单的宏。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.