Vim中使用一个正则表达式同时删除空白和注释行

21

我希望一次性删除空白和注释行。我已经找到了有关删除空白行的类似问题,对于空白行,我使用以下代码:

:g/^$/d

对于已注释的行:

:g/^#/d

我很好奇是否有办法将这些正则表达式合并为一个?类似于

:g/^[$#]/d

但显然在vim中不起作用。

5个回答

29

您可以尝试使用此命令:

:g/^\(#\|$\)/d
或者
:g/\v^(#|$)/d
  • $ 可以在 [...] 中匹配字面字符 '$' (输入 :help /$ 获取帮助)
  • \| 用于交替选择
  • \v 是非常魔法的(使用最少的反斜杠转义)

1
这里唯一建议的是通过在 d 操作符后添加下划线将已删除的行发送到黑洞寄存器。就像这样::g/\v^(#|$)/d_ 如果文件很大,这会明显更快。而且,已删除的注释可能不需要用于后续粘贴,为什么要保留它们呢? - Peter Perháč
@PeterPerháč 当你这样做时,可以使用撤销吗? - Joel Franco Guzmán
@JoelFrancoGuzmán 是的,我相信这将取决于您的撤消配置(它可以保存多少数据,如果您有一个巨大的文件)。您应该能够在一些虚拟文本文件上尝试一下。自己看看您是否可以撤消。但我相信您可以。 - Peter Perháč

5
另一种解决方法是保留非注释行: :g!/^[^#]/d

4
您可以使用“或”运算符\|来组合正则表达式模式,例如:
:g/^\(#.*\|$\)/d

虽然在这种情况下,您只需要指定#.*是可选的,例如:
:g/^\(#.*\)\?$/d

最后要注意,您可以使用VIM的“管道”运算符(而不是正则表达式)将大多数命令链接在一起,例如:|

:g /^#/d | /^$/d

4
请尝试以下方法:
:g/^$/d | /^#/d
< p > | 用于同时组合多个命令。


你不能将g管道,但g适用于管道中的所有命令。因此,更好的写法是:g /^$/d | /^#/d - Will Palmer

3

在 kevs 的回答基础上进行扩展:
如果有人也想删除缩进的配置文件中的注释,
例如:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # SSL configuration
    #
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    #
    # Self signed certs generated by the ssl-cert package
    # Don't use them in a production server!
    #
    # include snippets/snakeoil.conf;
    ...

您可以尝试这样做:
:g/\v^(#|$|\t#)/d

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