在Vim中,如何对多个文件重复多次替换?

我有 10 个文件,每个文件都包含“apple”和“red”。我想在所有 10 个文件中将“苹果”更改为“梨”并将“红色”更改为“绿色”。

我目前的方法是:%s/apple/pear/g在每个文件中输入这个查找和替换命令(对于红色到绿色也是如此)。如何保存这两个替换并将它们应用于 10 个文件。更一般地说,我如何更有效地做到这一点?

我是 vim 的新手,不确定是否查看命令历史记录或 vim 寄存器或其他内容。

回答

基础知识

Vim 没有提供项目范围的查找和替换。归结为执行以下步骤:

  • 创建您希望处理的文件列表
  • 对列表中的每个文件运行您的命令

替代

您可以使用|.

例子

:s/apple/pear/ | s/red/green/

既然你更新这些文件可能是最好也:write:update文件,以及

:s/apple/pear/ | s/red/green/ | update

替换标志:

  • 使用g了“全球”或做每行多重替换
  • 使用e压制错误。我们需要这个,因为文件可能有apple但没有red例如

:s需要一个范围,比如1,3在第 1 行到第 3 行上工作。$表示最后一行号。整个文件是1,$. 使用%的简写1,$

:%s/apple/pear/ge | %s/red/green/ge | update

想法:

  • 可能想要使用<&>围绕您的模式。例如red模式red可以用不同的词来表示predicate
  • 可能要考虑情况

参数列表

如果您使用要处理的文件列表启动 Vim,那么这些文件已经在参数列表中

$ vim file*.txt

您可以在 vim 启动后通过:args或提供参数:argadd。例如:args file*.txt

使用:args看参数列表

用于在参数列表中的所有文件:argdo {cmd}上运行您的命令{cmd}

快速修复列表

通常您想在一组文件中搜索一个模式,然后对这些匹配进行替换。Vim 的:vimgrep&:grep搜索文件并将这些位置放入 Quickfix List

:vimgrep /apple|red/ **/*.txt

您可以使用:copen或来查看快速修复列表:clist

使用:cdo {cmd}/在 quickfix 列表中的每个位置/文件:cfdo {cmd}上运行命令{cmd}

:cfdo %s/apple/pear/ge | %s/red/green/ge | update
:cdo s/apple/pear/e | s/apple/pear/e | update

升级 :grep

:grep将使用'grepprg'&'grepformat'来执行和读取程序的输出grep(在 linux 上默认使用)。这通常比:vimgrep以使用不同的正则表达式语法为代价要快。

您可以使用类似ripgrep或ag the silver searcher 之类的东西,而不是使用grepas your 'grepprg',它们通常比 plain 更快。grep

ripgrep 的配置选项示例:

set grepprg=rg --vimgrep
set grepformat=%f:%l:%c:%m

现在您可以:grep 'apple|red'填充quickfix列表

如果您愿意,您甚至可以通过在子外壳中运行来进一步执行:grep此操作

其他名单?!?

Vim 有其他列表,如:缓冲区、窗口、选项卡、位置列表。它们有一个关联的“do”命令::bufdo, :windo, :tabdo,:ldo

废除的 :Subvert

虽然不需要插件来跨文件进行此类替换,但了解 Tim Pope 的vim-abolish插件可能会很方便。特别是如果您有许多这些替换和/或有大小写问题。取消:Subvert/:S命令可以将您的替换命令减少到 1 个命令

:%S/{apple,red}/{pear,green}/gw

这将转换apple->pearred->green由于它们在花括号内的位置。

使用:Subvert'sw标志仅替换单词。Subvert 也会处理案件

Vimcasts

以下是一些相关的Vimcasts剧集:

  • 认识arglist
  • 填充 arglist
  • 使用 :argdo 更改多个文件
  • 使用 :vimgrep 搜索多个文件
  • 项目范围内的查找和替换(注意:cdo/:cfdo现在在 Vim 中)
  • 使用 :Subvert 进行增压替换

TL; 博士

搜索:vimgrep并运行您的替换:cfdo

:vimgrep /apple/red/ *.txt
:cfdo %s/apple/pear/ge | %s/red/green/ge | update

如需更多帮助

使用 Vim 的帮助系统阅读更多信息

   :h argument-list
   :h :argdo
   :h :args
   :h quickfix.txt
   :h :cdo
   :h :cfdo
   :h :vimgrep
   :h :grep
   :h 'grepprg'
   :h 'grepformat'


以上是在Vim中,如何对多个文件重复多次替换?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>