如何选择匹配模式的所有行?

时间:2014-10-30 13:25:57

标签: vim

是否可以选择与模式匹配的所有行?

为了说明,使用列:

      1     2  3                                   1 2 3
   2     1  4      select all lines matching 1     2 1 4
1 2      2            :'<,'>!column -t             1 2 2
  3   2    3            ->                           3   2    3
 1 1   3                                           1 1 3
    4 4     4                                        4 4     4

3 个答案:

答案 0 :(得分:3)

默认情况下,Vim无法匹配多条分隔线。

您可以查看this scriptthis one(更新),看看它是否适合您。

但是,如果您只是选择要对它们执行命令的行,则可以使用:g命令直接在这些行上执行命令。

:g/regex/ex command

例如:

:g/hello/d

将删除与正则表达式hello

匹配的所有行

使用multiple cursors插件(也在上面链接),您可以选择多个与正则表达式匹配的分隔行:

:% MultipleCursorsFind Regex

这将为您选择行,然后您可以执行任何您喜欢的命令。

答案 1 :(得分:2)

根据你的例子,我猜你要删除所有空行前缀,其中行中有1。所以在vi中,我们可以不选择:

:%s/\s*\(.*1.*\)$/\1

更新:

总是以传统的vi方式解决问题的方法。

根据你的新例子,我想你想要删除行中包含1的所有空格。所以我们可以:

:g/1/s/\s\+//g

或者您可能希望留出一个空格进行对齐:

:g/1/s/\s\+/ /g

g/1/匹配文件中包含1的所有行,s/\s\+//g将所有空格替换为一行范围内的全局空格。

答案 2 :(得分:2)

如果我理解你的问题,答案很简单:

qregisterq
:g/pattern/y REGISTER

如果您以前使用过,那么第一行是清理寄存器内容所必需的。 在第二行中,重要的是将寄存器的名称大写,因为这意味着您打算附加每个匹配行的内容,而不是替换它。

要粘贴匹配的行,只需执行以下操作:

"registerp

甚至更简单:

p

因为p复制了上次使用的寄存器的内容。

例如,要选择匹配1的所有行(使用寄存器a):

qaq
:g/1/y A

然后:

"ap