是否可以选择与模式匹配的所有行?
为了说明,使用列:
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
答案 0 :(得分:3)
默认情况下,Vim无法匹配多条分隔线。
您可以查看this script或this 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