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

标题很长,所以直入主题:
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 这些变量,单引号无效
    原文作者:VirusKnight
    原文地址: https://www.jianshu.com/p/e562f5a7b987
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞