如何用Bash/sed/grep/find基础脚本递归替换指定文件内容?
最简单的Bash实现方法
这题我熟!用find搭配sed就能搞定,一行命令就够,而且都是基础工具,完全匹配你的需求:
find /your/starting/folder -name "file.txt" -type f -exec sed -i 's/Foo/Bar/g' {} +
拆解一下每个部分的作用:
/your/starting/folder:把这个替换成你实际要开始遍历的文件夹路径(比如.代表当前目录)-name "file.txt":精确匹配名为file.txt的文件,大小写敏感(如果需要忽略文件名大小写可以换成-iname,但你要的是指定名称,所以用-name刚好)-type f:只处理普通文件,避免误操作目录或其他特殊文件-exec sed -i 's/Foo/Bar/g' {} +:对找到的所有文件执行sed替换:-i:原地修改文件内容(不用生成临时文件)s/Foo/Bar/g:全局替换所有大小写敏感的Foo为Bar(g表示全局,不加的话只替换每行第一个匹配项;这里没加i选项,所以严格区分大小写,完全符合你的要求){} +:把所有找到的文件一次性传给sed,比{} \;逐个处理更高效
额外实用提示:
- 如果想备份原文件(生成比如
file.txt.bak),只需要给sed的-i加后缀:
替换完成后,要是确认没问题,可以用这条命令批量删除备份:find /your/starting/folder -name "file.txt" -type f -exec sed -i.bak 's/Foo/Bar/g' {} +find /your/starting/folder -name "file.txt.bak" -delete - 如果遇到权限不足的报错,可以加上
-perm -u+w只筛选当前用户可写的文件,或者在命令前加sudo(谨慎使用,避免误改系统文件) - 要是想先预览替换效果再执行,可以去掉
-i选项,sed会把修改后的内容输出到终端,不会改动原文件:find /your/starting/folder -name "file.txt" -type f -exec sed 's/Foo/Bar/g' {} \;
内容的提问来源于stack exchange,提问作者M.E.
相关产品推荐
相关产品推荐

