使用Vim在所有文件中进行交互式查找和替换,包括子目录中的文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Vim在所有文件中进行交互式查找和替换,包括子目录中的文件相关的知识,希望对你有一定的参考价值。

我想使用Vim找到某些字符串并将其替换为另一个字符串。对于每个替换,它应该要求确认类似于%s/foo/replace/gc对Vim中的单个文件所做的确认。

我试过了什么?

  1. sed:它不进行交互式替换。
  2. 以下this link中的一条评论建议vim -esnc '%s/foo/bar/g|:wq' file.txt。我尝试了vim -esnc '%s/foo/bar/gc|:wq' file.txt(使用gc而不是g)。现在终端卡住了。
  3. Emacs xah-find-replace package。不幸的是,它没有像链接中所承诺的那样进行交互式替换。
答案

在bash中打开双星列出所有子目录中的所有文件:

shopt -s globstar

现在用所有文件启动vim一次并对所有文件运行substitute命令,然后保存并退出:

vim -c 'set nomore' -c 'argdo %s/foo/bar/gc' -c xa **/*.txt
另一答案

:argdo与替换命令组合将是推荐的方法。

您可以通过打开所有文件vim *.txt来填充args,或者在使用以下命令打开vim后手动填充它:

:args `find . -type f -name '*.txt'`

现在使用命令设置隐藏:

:set hidden

这是必需的,以便在从一个缓冲区切换到另一个缓冲区时不会提示您保存文件。有关更多信息,请参阅:h hidden

现在使用像你习惯的替换命令,为argdo添加前缀,为argslist中的每个文件执行此操作

:silent argdo %s/pattern/replace/gec

silent是可选的,只是使报告静音。 e标志将停止报告某些缓冲区中的错误找不到匹配的消息

现在,在替换之后,您可以使用以下命令编写更改

:argdo update

这将写入仅被修改的缓冲区。

另一答案

如果您正在寻找交互式替换模式,使用vim更容易。

vim -c '%s/PATTERN/REPLACEMENT/gc' -c 'wq' FILENAME

您的情况下卡住的终端是由于将save命令传递给替换字符串,因为它不允许交互模式进入操作。并且它不是卡住的终端,如果您键入“是”并按回车它仍应显示预期结果。

如果涉及多个文件,这些文件分布在多个子目录中,使用带有for循环的find命令将有所帮助,如下所述:

for FILENAME in `find DIRECTORYPATH -type f -name *.txt` 
do 
    vim -c '%s/PATTERN/REPLACEMENT/gc' -c 'wq' $FILENAME
done

以上是关于使用Vim在所有文件中进行交互式查找和替换,包括子目录中的文件的主要内容,如果未能解决你的问题,请参考以下文章

Linux使用vim进行多文件查找和替换的方法

VSCode 正则表达式查找和替换子匹配数学?

在 Vim 中优雅地查找和替换

在 Vim 中优雅地查找和替换

在 Vim 中优雅地查找和替换 vi

在VIM中进行快速的查找和替换