标题很长,所以直入主题:
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
使用:输入三个参数 文件名 旧文本 新文本
效果:该目录下(包括所有子目录)下,所有文件名为输入的文件名的文本将会进行全局的文本替换
主要的原理是:
- 通过 find 命令找出所有的文件所在位置
- 通过分割将 find 返回的字符串改为数组
- 通过 sed 命令将文本进行替换
其中,要注意的是,file 返回的是字符串,所以需要进行数组的转换,IFS是分割符号,详情看链接:http://1985wanggang.blog.163.com/blog/static/776383320121745626320/
(不过经过实验发现逗号也能实现分组,原因不明)
最后记录一下遇到过的坑
- sed 在 Linux 和 Mac 环境下 -I 的参数不同,Linux 只需
sed -I "s/$2/$3/g" $a
即可,Mac 下需要多一个备份参数(可传空),详情查看:http://blog.csdn.net/fdipzone/article/details/51253955 - 关于 sed 的使用,网络上一直说的不算清晰吧,这里记录一下,s/ 代表替换,中间的 / 用来分隔新旧文本,/g 代表修改全局,详细查看:http://www.360doc.com/content/14/0609/16/203871_385127085.shtml
- 只有双引号才可以引用 $2 这些变量,单引号无效