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

问题描述 投票:0回答:3

这就是我的意思 -

假设我的文件中都有这些

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 替换

only
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

问题是,如何通过搜索和替换保留实际查询(...某物...在哪里)?

vim replace
3个回答
8
投票

vim 正则表达式中

\zs
原子的完美用例。这告诉 vim 在进行替换时忽略
\zs
之前(包括)的任何内容。

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

可以在

\zs
找到对
:help /\zs
的更好解释。


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.

0
投票

执行此操作的正则表达式:

:%s/\(^\(\(.*client.*\)\@!.\)*\)each.hash/\1each(:as => :hash)/g

请参阅

^\(\(.*client.*\)\@!.\)*
部分的解释:https://vim.fandom.com/wiki/Search_for_lines_not_containing_pattern_and_other_helpful_searches

© www.soinside.com 2019 - 2024. All rights reserved.