我在超级用户上发布了这个问题,我被建议在stackoverflow上发布这个问题.
我真的很喜欢vim,今天我遇到了有趣的问题,我认为可以通过regexp完成,但我无法形成正确的问题.
我有一个非常大的sql文件.它整合了许多不同的查询.文件包含以下内容:
select * from hr.employees, oe.orders, oe.order_items
select * from hr.employess, oe.orders, hr.job_history
select * from oe.customers, oe.orders, hr.employees
select * from hr.employees, hr.departments, hr.locations
Run Code Online (Sandbox Code Playgroud)
如何只选择那些只有一行匹配hr.
的行?例如,上面它将是第一行和第三行.
当然,可以匹配这些线.此模式匹配:
^\%(\%(hr\.\)\@!.\)*hr\.\%(\%(hr\.\)\@!.\)*$
Run Code Online (Sandbox Code Playgroud)
有些人喜欢通过使用非常神奇的开关来减少反斜杠的数量\v
.然后相同的模式变成了
\v^%(%(hr\.)@!.)*hr\.%(%(hr\.)@!.)*$
Run Code Online (Sandbox Code Playgroud)
(这里我使用了非捕获括号,\%(...\)
但捕获括号\(...\)
也可以.)
问题是:你想用这些线做什么?删除它们?
在这种情况下,您可以使用:global
命令:
:g/\v^%(%(hr\.)@!.)*hr\.%(%(hr\.)@!.)*$/d
Run Code Online (Sandbox Code Playgroud)
更多信息在
:h :global
:h /\v
:h /\%(
:h /\@!