在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->pear和red->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'