使用Vim在所有文件中进行交互式查找和替换,包括子目录中的文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Vim在所有文件中进行交互式查找和替换,包括子目录中的文件相关的知识,希望对你有一定的参考价值。
我想使用Vim找到某些字符串并将其替换为另一个字符串。对于每个替换,它应该要求确认类似于%s/foo/replace/gc
对Vim中的单个文件所做的确认。
我试过了什么?
答案
在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在所有文件中进行交互式查找和替换,包括子目录中的文件的主要内容,如果未能解决你的问题,请参考以下文章