如何在保留通配符内容的同时在vim中执行搜索/替换?

时间:2012-02-15 13:43:51

标签: vim replace

这就是我的意思 -

说我在整个文件中都有这些

ActiveRecord::Base.connection.execute("select * from table1").each_hash do ..
ActiveRecord::Base.connection.execute("select * from table2").each_hash do ..
ActiveRecord::Base.connection.execute("select * from table3").each_hash do ..

client.query("select * from table1").each_hash do ..
client.query("select * from table2").each_hash do ..
client.query("select * from table3").each_hash do ..

我想用each_hash替换 ActiveRecord的each(:as => :hash)来电,所以我会得到:

ActiveRecord::Base.connection.execute("select * from table1").each(:as => :hash) do ..
ActiveRecord::Base.connection.execute("select * from table2").each(:as => :hash) do ..
ActiveRecord::Base.connection.execute("select * from table3").each(:as => :hash) do ..

并使client.query行不受影响。

我知道我可以使用宏,但是如何使用vim的搜索/替换呢?我想过用这个:

%s/\.execute(.*).each_hash/ ...something... /g

问题是,如何通过搜索和替换来保留实际查询(什么地方......某些东西......)?

2 个答案:

答案 0 :(得分:8)

vim正则表达式中\zs原子的完美用例。这告诉vim在进行替换时忽略(包括)\zs之前的任何事情。

:%s/\.execute(.\{-})\.each\zs_hash/(:as => :hash)/

可以在\zs找到:help /\zs更好的解释。

答案 1 :(得分:4)

您可以使用global命令进行过滤。

:g/^ActiveRecord/s/each_hash/each(:as => :hash)/g

输入:help :g以获取帮助:

:[range]g[lobal]/{pattern}/[cmd]
            Execute the Ex command [cmd] (default ":p") on the
            lines within [range] where {pattern} matches.