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

sa1*_*125 1 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 ..
Run Code Online (Sandbox Code Playgroud)

我想替换ActiveRecord的each_hash调用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 ..
Run Code Online (Sandbox Code Playgroud)

并使client.query行不受影响.

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

%s/\.execute(.*).each_hash/ ...something... /g
Run Code Online (Sandbox Code Playgroud)

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

Ran*_*ris 8

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

:%s/\.execute(.\{-})\.each\zs_hash/(:as => :hash)/
Run Code Online (Sandbox Code Playgroud)

更好的解释\zs可以在:help /\zs.