Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Vim中,如何对多个文件重复多个替换?_Vim_Substitution - Fatal编程技术网

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

在Vim中,如何对多个文件重复多个替换?,vim,substitution,Vim,Substitution,我有10个文件,每个都包含“苹果”和“红色”。我想在所有10个文件中将“苹果”改为“梨”,将“红色”改为“绿色” 我当前的方法是在每个文件中键入这个find and replace命令:%s/apple/pear/g(从红色到绿色也是如此)。如何保存这两个替换并将其应用于10个文件。更一般地说,我如何更有效地完成这项工作 我是vim新手,不确定是否要查看命令历史记录或vim寄存器或其他内容。您可以使用诸如:argdo或:bufdo之类的命令在许多文件上重复相同的Ex命令。(请参见:帮助:argd

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

我当前的方法是在每个文件中键入这个find and replace命令
:%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
    /
    :cfdo
    现在在Vim中)
TL;博士 使用
:vimgrep
搜索并使用
:cfdo

:vimgrep /apple\/red/ *.txt
:cfdo %s/apple/pear/ge | %s/red/green/ge | update
需要更多帮助 使用Vim的he阅读更多信息