在 vim 中查找并替换多个文件中特定字符串的所有实例

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

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

感谢您提前抽出时间!

vim vi
3个回答
23
投票

一般工作流程是:

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

第一步可以使用填充快速修复列表的任何命令来完成:

:help :vimgrep
:help :grep
、来自第三方插件的命令等。

:grep
为例:

:grep foo **/*.js

将使用当前目录和子类别中

foo
文件中找到的每个
*.js
的条目填充快速修复列表。您可以通过
:cwindow
查看列表。

第二步涉及

:help :cdo
:help :cfdo

:cdo s/foo/bar/gc

它将在快速修复列表中的每一行上用

foo
替换每个
bar
并要求确认。使用
:cfdo
,它看起来像这样:

:cfdo %s/foo/bar/gc

如果你超级有信心,你可以把最后的

c
去掉。请参阅
:help :s_flags

第三步涉及

:help :update

:cfdo update

如果快速修复列表中的每个文件已更改,它将写入磁盘。

简而言之:

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

5
投票

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

:argdo %s/pattern/replacement/ge

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

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

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

查看一系列有关如何做更多事情的精彩屏幕截图 这里并查看这个 情节在 特别。


0
投票

我只是想补充 mattb 的答案,这在手册的第 26.3 节中进行了专门讨论。

举个简单的例子:

:args *.c
:argdo %s/old_pattern/new_pattern/ge | update

第一个命令选择要应用更改的文件,而第二个命令则应用更改。 更详细:

  • %s
    更改文件中的所有行。
  • ge
    对文件中每行的所有实例进行更改,从而抑制任何错误。
  • update
    写入文件(如果已更改)。

存在用于跨所有窗口或所有缓冲区进行此类更改的类似物。 更多详细信息请参阅手册。

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