Vim删除空白行

759

我应该在Vim中运行什么命令来删除空行?

14个回答

1395
:g/^$/d

:g命令将在匹配正则表达式的行上执行一个命令。该正则表达式是“空白行”,命令是:d(删除)


50
谢谢soulmerge。这是我最喜欢的答案,因为它实际上解释了:g命令的作用。 - Tim Swast
5
这将删除所有不包含空格字符的空行,但这可能并不是唯一的要求。有人可能仍然希望保留其中的一个空行。使用“:%!cat -s”可能是一个选择。 - coanor
3
:g/^\s*$/d 使用正则表达式“任何可能的空格字符”来匹配行。 - oyd11
@soulmerge,加上范围1,$/^\s$/d或使用标签'a,'b/^\s$/d怎么样?这对我不起作用。 - Alexander Cska
@AlexanderCska 应该是 1,$g/^$/d - brownian

215

找到了,它是:

g/^\s*$/d

来源:vim wikia 上的 Power of g

:g 的简要解释

:[range]g/pattern/cmd

这将针对指定的[范围](默认为整个文件),通过执行Ex命令cmd来处理每一行匹配的pattern(Ex命令以冒号开头,例如:d表示删除)。在执行cmd之前,“.”会被设置为当前行。


9
好的。但不完全是一行空白。 - innaM
14
啊,是的,这将匹配只包含空格字符的行。我会接受soulmerge的答案。 - nearly_lunchtime
17
应该匹配空白行和仅由空格组成的行...(*匹配零个或多个\s的实例...)? - monojohnny
14
我认为纯空格确切地说就是一行空白,然而没有空格的情况更像是一行空行,不是吗? ;) - Kasapo
5
牛津词典中将“blank”定义为“文档中留待填写的空间”。你可以根据自己的理解来解释,但这正是我所需要的。谢谢! - Joe Tricarico
显示剩余2条评论

57
:v/./d

或者

:g/^$/d
或者
:%!cat -s

9
使用“:v/./d”是个巧妙的技巧,但使用后需要执行“:nohl”命令取消高亮显示。 - Claes Mogren
1
@ClaesMogren 或者只需控制-1来弹回。 - jm3
6
根据http://vim.wikia.com/wiki/Power_of_g,@zladuric所说的是反转全局命令(它会在所有不匹配的内容上执行该命令)。 - adam_0

46
以下代码可用于删除多个空白行(将它们减少为单个空白行),并保留单个空白行不变:
:g/^\_$\n\_^$/d

3
可以有人解释一下令牌是什么意思吗?(也就是说,它是如何工作的?)谢谢。 - PAStheLoD
5
\_$ 表示匹配模式内的行末位置($ 只能用于模式的末尾),\_^表示匹配模式内的行首位置,可以在模式的任何位置使用。因此,该模式可以匹配空行、换行和再次空行。请参阅Vim regex help page - Wiktor Stribiżew
1
另一种实现相同效果的方法是::g/^$/,/./-j - SergioAraujo

15
  1. 如何删除所有空白行。

:%s,\n\n,^M,g

多次执行此操作,直到所有空行都被删除

  • 如何删除所有空白行,只留下一行空行

  • :%s,\n\n\n,^M^M,g
    
  • 多次执行此操作

  • 如何删除所有空白行,最多留下两个空白行

  • :%s,\n\n\n\n,^M^M^M,g
    

    (多次进行此操作)

    为了输入^M,我需要在Windows中按Control-Q和Control-M键。


    2
    你也可以使用\r代替Ctrl-M - dash-tom-bang

    10

    这对我很有用

    :%s/^\s*$\n//gc


    2
    我使用类似的东西::%s/^\n//gc - Clint Pachl
    好的,唯一需要确认的! - Antonio
    克林特的确有效。我正在使用 Neovim。 - undefined

    8
    如何:
    :g/^[ \t]*$/d
    

    6

    在插入模式下按下delete键可删除空行。


    5

    这个函数只会删除两行或更多的空白行,将以下代码添加到你的vimrc文件中,然后使用\ d调用该函数。

    fun! DelBlank()
       let _s=@/
       let l = line(".")
       let c = col(".")
       :g/^\n\{2,}/d
       let @/=_s
       call cursor(l, c)
    endfun
    map <special> <leader>d :keepjumps call DelBlank()<cr>
    

    5

    我尝试了本页上的一些答案,但很多都对我无效。可能是因为我在Windows 7上使用Vim(不要嘲笑我,只是可怜一下我: p)?

    以下是我发现在Windows 7上使用Vim最简单有效的方法:

    :v/\S/d
    

    以下是关于 Vim Wikia 上的更详细的答案: http://vim.wikia.com/wiki/Remove_unwanted_empty_lines


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