【问题标题】:Find and replace all instances of specific string in multiple files in vim在vim的多个文件中查找并替换特定字符串的所有实例
【发布时间】:2021-12-28 08:38:12
【问题描述】:

我对 Vim 还是比较陌生,不知道如何替换多个文件(来自特定项目目录)中特定字符串的所有实例。理想情况下,我想在没有任何额外插件的情况下做到这一点;正在研究 :vimgrep 和 :arg 选项,但无法解决。

提前感谢您的宝贵时间!

【问题讨论】:

  • 现在您已经对您的问题有了一些答案,现在是encouraged 来支持任何好的答案,并接受一个(如果您觉得它对 Q 的回答足够好)。像往常一样,罗马人的回答比我的要好:)
  • 只有两种不同但有效的方法。

标签: vim vi


【解决方案1】:

一般的工作流程是:

  1. 在整个项目中搜索您的模式。
  2. 对每个匹配项进行操作(更安全、更慢)或对每个具有匹配项的文件(风险更大、更快)进行操作。
  3. 写下您的更改。

第一步可以使用填充快速修复列表的任何命令完成::help :vimgrep:help :grep、来自第三方插件的东西等。

:grep为例:

:grep foo **/*.js

将为在当前目录和子类别中的*.js 文件中找到的每个foo 填充一个条目。您可以使用:cwindow查看列表。

第二步涉及:help :cdo:help :cfdo

:cdo s/foo/bar/gc

它将在快速修复列表中的每一行用bar 替换每个foo 并要求确认。使用:cfdo,它看起来像这样:

:cfdo %s/foo/bar/gc

如果你超级有信心,你可以把c放在最后。见:help :s_flags

第三步涉及:help :update

:cfdo update

如果quickfix列表中的每个文件被更改,它会将它们写入磁盘。

简而言之:

:gr foo **/*.js
:cdo s/foo/bar/gc
:cfdo up

【讨论】:

  • 这也有效。非常感谢您的帮助;我喜欢这样一个事实,它可以让你对每场比赛进行操作。
【解决方案2】:

您可以在 arg 的所有文件的所有行上运行标准替换命令 像这样列出:

:argdo %s/pattern/replacement/ge

如果您想将特定目录中的所有文件添加到 arg 列表中, 你可以使用:

argadd `path/to/dir/*.py`

请注意上面示例中的反引号。

观看一系列关于如何做更多事情的精彩视频 here 并看到 this episode 在 特别的。

【讨论】:

  • 辛苦了,非常感谢!看起来也像一个精彩的屏幕演员系列,不敢相信我还没有碰到这个。
  • @John_L_Smith 很高兴它有帮助 - 幕后演员系列背后的人还有一本书“Drew Neil 的 Practical Vim”,非常值得一读(还有第二本书,“Modern Vim” ,但我认为它的用处不大)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2018-08-20
  • 2014-04-23
  • 2013-11-28
  • 2023-01-12
  • 2020-08-21
  • 2021-08-16
相关资源
最近更新 更多