2012-02-15 30 views
1

这就是我的意思是 -如何在保留通配符内容的情况下在vim中执行搜索/替换?

说我有这些在我的文件

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(:as => :hash)更换 ActiveRecord的的each_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 

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

回答

8

完美使用案例Vim的正则表达式的\zs原子。这告诉vim在做替换之前忽略(包括)\zs

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

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

+1

B-R-I-L-L-I-A-N-T。谢谢! – sa125 2012-02-15 13:52:35

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. 
相关问题