这就是我的意思 -
假设我的文件中都有这些
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
替换
onlyActiveRecord 的
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
问题是,如何通过搜索和替换保留实际查询(...某物...在哪里)?
vim 正则表达式中
\zs
原子的完美用例。这告诉 vim 在进行替换时忽略 \zs
之前(包括)的任何内容。
:%s/\.execute(.\{-})\.each\zs_hash/(:as => :hash)/
可以在
\zs
找到对 :help /\zs
的更好解释。
您可以使用
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.
执行此操作的正则表达式:
:%s/\(^\(\(.*client.*\)\@!.\)*\)each.hash/\1each(:as => :hash)/g
请参阅
^\(\(.*client.*\)\@!.\)*
部分的解释:https://vim.fandom.com/wiki/Search_for_lines_not_containing_pattern_and_other_helpful_searches