[精讚] [會員登入]
3658

[PERL]] find 和 perl 的結合--大量檔案中文字的取代

利用PERL作大量的文件取代

分享此文連結 //n.sfs.tw/10677

分享連結 [PERL]] find 和 perl 的結合--大量檔案中文字的取代@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2023-03-24 11:28:07 最後編修
2017-01-24 13:53:24 By 張○○
 

自動目錄

如果要把所有的文件檔作取代,例如將字串"charset=big5" 改為 "charset=utf-8",文件檔如果不多直接編輯就好,但如果文件檔一多,甚至還放在子目錄裡,就很費工。

還好可以利用PERL的簡單的指令完成:

原字串:
charset=big5

取代後字串:
charset=utf-8

取代目前目錄包括子目錄的所有PHP檔

指令

$ find ./ -type f -name '*.php' -exec perl -i -pe s/charset=big5/charset=utf-8/gi {} \;

說明[2][3]

find
./ 開始目錄含子目錄尋找
-type f 指定檔案,不含目錄及連結
-name '*.php' 所有 *.php檔
-exec 找到目標後執行後面的指令
  perl -i -pe s/charset=big5/charset=utf-8/gi
    -i 直接修改原檔案不建立備份
    -p 重複執行直到檔案結束
    -e 執行後面的命令
        s/charset=big5/charset=utf-8/gi
         s 取代
         /原字串/換成字串/
         g 持續取代到行尾
         i 不分大小寫
{} find尋找到的檔案
\; find 指令結束

注意

1. 此項操作不能復原,所以千萬不能打錯字。
2. 此項操作不會有任何回應,除非指令打錯。
3. 這種方法可以擴大使用到所有的取代,換句話說,只要是取代檔案中的文字,就不用一個一個文件開啟

以上的方法對於簡單的比對字串是ok,但是對於複雜的字串取代,這個指令基本上就會出錯,例如要把網址 http://n.sfs.tw/10677 取代為空,這樣寫就出錯

$ find ./ -type f -name '*.php' -exec perl -i -pe s/http:\/\/n\.sfs\.tw\///gi {} \;

主要因為 console 的 shell 是不認識脫逸字元'\'

對於複雜的取代,最好的方法就是寫一個PERL的程式

所以我撰寫一個簡單的取代程式:replace.pl

#!/usr/bin/perl -w

if(  !$ARGV[0] )  {die  "請指定檔案\r\n";}
$fn= $ARGV[0];

open(FILE, $fn) or die "$!";
$cnt=0;
$data="";
while(<FILE>){
  $cnt += ($_ =~ s!http://n\.sfs\.tw/!!ig);
  $data .= $_;
}

print "[$fn]總共置換:". $cnt."筆\n";
close( FILE);
open( FILE, "> $fn") or die "$!";
print FILE $data;
close( FILE);

第3行,這個程式要接受一個傳入的參數,也就是要作取代字串的檔案。

再結合find 指令就能完全的取代:

$ find ./ -type f -name '*.php' -exec ./replace.pl {} \;

強到爆

後記

某外國網友sally看到這篇向我推薦他同事做的 cheatsheet (小抄),有興趣的可以參考一下[4]:

 https://www.pcwdld.com/perl-cheat-sheet 

參考資料

[1] EcStart PHP 技術討論論壇  http://bbs.ecstart.com/thread-8502-1-1.html

[2] http://stackoverflow.com/questions/6302025/perl-flags-pe-pi-p-w-d-i-t

[3] http://www.perl.com/pub/2004/08/09/commandline.html

[4] https://www.pcwdld.com/perl-cheat-sheet#wbounce-modal

END

你可能感興趣的文章

[PERL] 17-參照 PERL的參照,就是指標

[PERL] 13- 變數的視界 變數的使用範圍,什麼是my,什麼是our?

[PERL] 11- 雜湊的範例 Perl 的幾個雜湊範例

[PERL] 21- 使用資料庫 Perl 連Mysql

Perl 的特殊變數:$` $' $#陣列 $1 $2 .. $10 \1 \2 .. \10 介紹Perl 的 $` $' $#array $1..$10 \1..\10這些變數

[PERL] 簡易檢查網頁記錄檔ip來源統計 利用PERL來檢查網頁記錄檔ip來源統計的簡易程式

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[HP DL380G7] 生效啟動第3,4片網卡/開啟或關閉內建的網卡 HP DL380G7 預設第3,4片網卡裝完系統後找不到,難道是壞了?要怎麼辦?

PHP for sphinx 函式庫安裝 PECL/sphinx PHP>= 5.2.2 已經能原生支援 sphinx,可是預設的沒有裝,我們得自己裝才能用

[Win7] 燒錄 iso 檔 在Windows7 中內建燒錄程式,可以直接把檔案拉到光碟機裡,再執行燒錄。

設計的工作絕不接受比價 拿買陽春麵的價格想買牛肉麵,寧願倒掉也不賣

最值得學的電腦技能 什麼是最值得學的電腦技能?程式設計?美工繪圖?系統網路?還是…? 都不是!個人覺得一個最值得學的電腦技能就