巧用shell脚本批量替换字符串

时间:2022-11-02 16:56:39

作者:田逸(formyz)

需求描述


有一个网站,因为域名变更,除了需要重新做域名解析外,还需要对网站目录的包含原域名的文件进行替换。包含域名(主机名)关键字的文件相当的多,它们分布在不同目录的以html、php、phtml 结尾的文件中。数千个文件,如果手工来替换,根本无法完成,因此,使用shell是不二之选。


巧用shell脚本批量替换字符串



基本思路


总体上分两步进行:

1、文件查找。将网站所在根文档目录包含关键字域名的文件全部查找出来;

2、在查找出来的文件中进行全文替换。

因为此操作具有很大的风险性,需要事先做一个模拟测试,即准备一个临时目录,从网站根文档所在的目录复制少许文件及目录,这些文件及子目录的文件包含欲修改域名的关键字。先用find质量查找所有文本文件,然后进行域名关键字匹配并全部替换。


巧用shell脚本批量替换字符串



虽然查出来的文件,有些可能并不包含需要替换的域名关键字,但可以通过匹配的方式,把未包含域名关键字的文件过滤掉,我这里使用的工具是sed。


撰写脚本


脚本由指令find、sed及for循环构成,其内容十分简单,全部内容如下所示:

#!/bin/bash

file_list=` find /tmp/formyz/ -name "*.php" -o -name "*.html" -o -name "*.phtml"`

for i in $file_list

do

sed -i 's#formyz.cn#formyz.com#g' $i

done

#!/bin/bash
file_list=` find /tmp/formyz/ -name "*.php" -o -name "*.html" -o -name "*.phtml"`
for i in $file_list
do
sed -i 's#formyz.cn#formyz.com#g' $i
done


巧用shell脚本批量替换字符串



实施替换


考虑到风险问题,需按步骤逐一进行。

1、执行指令 sh -n /usr/bin/modify.sh 进行语法检查,确认脚本的书写正确性;

2、去掉选项“-n”,真正使脚本运行起来;

3、查验脚本运行结束后,测试目录“/tmp/formyz”里边的文本是否被替换。

4、修改脚本,将find 查找目录改成网站根文档所在的路径。任然先执行带选项“-n”的操作,检查一遍语法;

5、进入screen环境(避免远程ssh中断、shell也因此中断),真正执行脚本,完成替换。


结果验证


通过两个方向来验证替换的正确性及有效性。

1、查验网站根文档下,是否还存在原域名的关键字,指令如下:

grep -r “formyz.cn” *

没有任何匹配输出,为合格。

2、查验网站根文档下,是否存在替换后的域名关键字,指令如下:

grep -r “formyz.com” *



巧用shell脚本批量替换字符串