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

文章目录

    由于我新项目是从 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

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式