sed 替换目录下所有文件中的指定字符串

更新日期: 2021-09-26 阅读次数: 3465 字数: 245 分类: Shell

由于我新项目是从 golang 旧项目中复制的代码,复制之后,需要将原 module 名替换为新的名字。 但是由于项目目录众多,文件众多,如果一个一个文件修改非常繁琐,所以需用 sed 来帮忙。

sed is a stream editor

一行 sed 命令搞定

例如需要将目录中所有的 sunzhongwei.com/member 替换为 sunzhongwei.com/repair,命令如下:

find /home/zhongwei/work/server_repair/backend/ \( -type d -name .git -prune \) -o -type f | xargs -0 sed -i 's/sunzhongwei\.com\/member/sunzhongwei\.com\/repair/g'

find print0 参数的作用

对比一下:

> find /home/zhongwei/work/server_repair/backend \( -type d -name .git -prune \) -o -type f -print0
/home/zhongwei/work/server_repair/backend/go.mod/home/zhongwei/work/server_repair/backend/go.sum/home/zhongwei/work/server_repair/backend/main.go

> find /home/zhongwei/work/server_repair/backend \( -type d -name .git -prune \) -o -type f
/home/zhongwei/work/server_repair/backend/go.mod
/home/zhongwei/work/server_repair/backend/go.sum
/home/zhongwei/work/server_repair/backend/main.go

加 print0 参数,是为了不以换行符分隔,以规避文件名中包含换行符的情况,我觉得有点多虑了。 我自己的项目文件,还不至于出现带换行符的情况。

参考

  • https://stackoverflow.com/questions/1583219/how-to-do-a-recursive-find-replace-of-a-string-with-awk-or-sed
  • https://www.gnu.org/software/sed/manual/sed.html

tags: sed

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式