天天看點

巧用shell腳本批量替換字元串

作者:田逸(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” *​