这就是我的意思 -
说我在整个文件中都有这些
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
问题是,如何通过搜索和替换来保留实际查询(什么地方......某些东西......)?
答案 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.