美文网首页ShellLinux 相关文章Linux学习之路
Mac 下使用 Shell 实现目录下所有同名文件文本替换

Mac 下使用 Shell 实现目录下所有同名文件文本替换

作者: 3697d6c42285 | 来源:发表于2017-09-01 13:33 被阅读62次

    标题很长,所以直入主题:
    chang.sh

    #!/bin/sh
    # 使用 find 寻找文件
    files=$(find . -name "$1")
    
    # 将字符串分割为数组
    OLD_IFS="$IFS" 
    IFS=" " 
    arr=($files) 
    IFS="$OLD_IFS" 
    
    # 将所有文件进行全局文本替换
    for a in ${arr[@]}
    do
        sed -i '' "s/$2/$3/g" $a
    done
    

    使用:输入三个参数 文件名 旧文本 新文本
    效果:该目录下(包括所有子目录)下,所有文件名为输入的文件名的文本将会进行全局的文本替换


    主要的原理是:

    1. 通过 find 命令找出所有的文件所在位置
    2. 通过分割将 find 返回的字符串改为数组
    3. 通过 sed 命令将文本进行替换

    其中,要注意的是,file 返回的是字符串,所以需要进行数组的转换,IFS是分割符号,详情看链接:http://1985wanggang.blog.163.com/blog/static/776383320121745626320/

    (不过经过实验发现逗号也能实现分组,原因不明)


    最后记录一下遇到过的坑

    1. sed 在 Linux 和 Mac 环境下 -I 的参数不同,Linux 只需 sed -I "s/$2/$3/g" $a 即可,Mac 下需要多一个备份参数(可传空),详情查看:http://blog.csdn.net/fdipzone/article/details/51253955
    2. 关于 sed 的使用,网络上一直说的不算清晰吧,这里记录一下,s/ 代表替换,中间的 / 用来分隔新旧文本,/g 代表修改全局,详细查看:http://www.360doc.com/content/14/0609/16/203871_385127085.shtml
    3. 只有双引号才可以引用 $2 这些变量,单引号无效

    相关文章

      网友评论

        本文标题:Mac 下使用 Shell 实现目录下所有同名文件文本替换

        本文链接:https://www.haomeiwen.com/subject/vjghjxtx.html