在Vim中,如何对多个文件重复多个替换?
我有10个文件,每个都包含“苹果”和“红色”。我想在所有10个文件中将“苹果”改为“梨”,将“红色”改为“绿色” 我当前的方法是在每个文件中键入这个find and replace命令在Vim中,如何对多个文件重复多个替换?,vim,substitution,Vim,Substitution,我有10个文件,每个都包含“苹果”和“红色”。我想在所有10个文件中将“苹果”改为“梨”,将“红色”改为“绿色” 我当前的方法是在每个文件中键入这个find and replace命令:%s/apple/pear/g(从红色到绿色也是如此)。如何保存这两个替换并将其应用于10个文件。更一般地说,我如何更有效地完成这项工作 我是vim新手,不确定是否要查看命令历史记录或vim寄存器或其他内容。您可以使用诸如:argdo或:bufdo之类的命令在许多文件上重复相同的Ex命令。(请参见:帮助:argd
:%s/apple/pear/g
(从红色到绿色也是如此)。如何保存这两个替换并将其应用于10个文件。更一般地说,我如何更有效地完成这项工作
我是vim新手,不确定是否要查看命令历史记录或vim寄存器或其他内容。您可以使用诸如
:argdo
或:bufdo
之类的命令在许多文件上重复相同的Ex命令。(请参见:帮助:argdo
)
例如,您可以通过将10个文件作为参数传递给Vim来打开它们。如果它们都是*.txt
文件,您可以使用:
$ vim *.txt
然后,您可以使用:argdo
对Vim作为参数获取的所有文件重复该操作:
:argdo %s/apple/pear/eg | update
这里需要注意的是,我在操作结束时添加了一个|update
,以便在执行替换后为每个文件保存文件。这很重要,否则在移动到下一个文件之前,:argdo
将出错。(请参见:help:update
,它类似于:w
,但仅在有修改时保存。|
是Vim中Ex命令的命令分隔符。)
使用| update
的替代方法是使用:set hidden
,这允许您在继续下一个文件之前开始编辑另一个文件。(请参见:help“hidden”
)完成所有修改后,您可以稍后使用:wall
写入所有文件
最后,我将向替换传递一个额外的/e
标志,以防止在没有匹配项可替换时生成错误。(请参见:帮助:s_e
)
还可以使用|
作为分隔符来链接多个命令(例如替换命令)。例如:
:set hidden
:argdo %s/apple/pear/eg | %s/red/green/eg
:wall
基础
Vim不提供项目范围的查找和替换。它归结为执行以下步骤:
- 创建要处理的文件列表
- 对列表中的每个文件运行命令
|
一个接一个地运行多个命令
范例
:s/apple/pear/ | s/red/green/
由于您正在更新这些文件,因此最好同时:写入或:更新文件
: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
可以用不同的词,如谓词
我想考虑一下这个案子
参数表
如果您使用希望处理的文件列表启动Vim,那么这些文件已经在参数列表中
$ vim file*.txt
您可以在vim启动后通过:args
或:argadd
提供参数。e、 g.:args文件*.txt
使用:args
查看参数列表
使用:argdo{cmd}
对参数列表中的所有文件运行命令{cmd}
快速修复列表
通常,您希望在一组文件中搜索模式,然后对这些匹配项进行替换。Vim的:vimgrep
&:grep
搜索文件并将这些位置放入快速修复列表中
:vimgrep /apple\|red/ **/*.txt
您可以使用:copen
或:clist
查看快速修复列表
使用:cdo{cmd}
/: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上默认使用)。这通常比使用不同的正则表达式语法更快
与使用grep
作为您的'grepprg'
不同,您可以使用类似或的东西,它们通常比普通的grep
更快
ripgrep的配置选项示例:
set grepprg=rg\ --vimgrep
set grepformat=%f:%l:%c:%m
现在您可以执行:grep'apple\| red'
来填充快速修复列表
:cfdo %s/apple/pear/ge | %s/red/green/ge | update
:cdo s/apple/pear/e | s/apple/pear/e | update
如果你愿意,你甚至可以更进一步
其他名单?!?
Vim还有其他列表,如:缓冲区、窗口、选项卡、位置列表。它们有一个相关的“do”命令::bufdo
,:windo
,:tabdo
,:ldo
废除
:颠覆
虽然不需要插件来跨文件进行这种替换,但了解Tim Pope的插件可能会很方便。特别是如果你有很多这样的替换和/或外壳问题。废除的:subversit
/:s
命令可以将替换命令减少为1个命令
:%S/{apple,red}/{pear,green}/gw
这将转换苹果->梨
和红色->绿色
,因为它们位于花括号内
使用:subversit
的w
标志仅替换单词。Subversit也将处理案件
维姆卡斯特
以下是一些相关的情节:
- (注意
/:cdo
现在在Vim中):cfdo
:vimgrep
搜索并使用:cfdo
:vimgrep /apple\/red/ *.txt
:cfdo %s/apple/pear/ge | %s/red/green/ge | update
需要更多帮助
使用Vim的he阅读更多信息