標籤:
很多時候,我們希望對原有檔案的內容進行一定的修改,linux雖然有sed這個強大的文本編輯命令,但是他只能產生新檔案或列印到screen上(或許sed也具有修改原檔案的功能,小的才疏學淺,尚不知道,煩請大家告訴我),但在perl裡卻有這麼一個命令$^I
例子:
1 #!/usr/bin/perl2 use strict;3 $^I="";4 while(<>){5 s/^rate.*/rate=0/;6 s/^testMode.*/testMode=0/;7 print;8 }
$^I的值可以決定是要重寫檔案,還是備份檔案,若要重寫,只須將其值設為空白就可,若要備份,則$^I=".bak", 他就會把改過的檔案命名為filename.bak了
http://hi.baidu.com/uncletuuthu/blog/item/862adb0062248e04728da501.html
當你編寫指令碼或是安裝程式的時候,就需要修改特定檔案的資料,如果這時有自動修改檔案的功能,那將會是非常實用的。例如,當你需要移動一個檔案中的某個字串或是命令,當你要改變許多檔案的IP地址的時候,這個功能就可以拿來利用了。
手動改變這些檔案會耗費很長的時間,特別當它是一件重複性的任務。但是,你可以使用Perl程式來完成。所有的Linux供應商都有這個程式。執行以下操作:
$ perl -pi -e ‘s|[old_string]|[new_string]|g‘ [file]
字串可以是簡單的命令或是常規的運算式。如果你要改變目錄的位置(例:從/var/spool/mail到/var/spool/messages),你想要改變目錄/etc下的每個檔案來反映路徑變化。執行以下操作:
$ find /etc -type f| xargs perl -pi -e ‘s|/var/spool/mail|/var/spool/messages|g‘
在這個例子上,我們使用搜尋和xargs來確保系統只運行常規檔案的命令,而不是非常規目錄或其它檔案類型的命令。這也就運行了/etc分類樹,而且會遞迴的改變所有檔案。
由於我們/標識,所以我們必須輸入了像/var這樣的路徑而不是/var。我們也可以在Perl運算式使用分隔字元。(除了使用|,你也能夠使用/, #,@作為分隔字元。)
執行以下操作,從整個檔案裡移開一個命令
$ perl -pi -e ‘s|myword||g‘ file
這就從基本上沒有使用任何東西卻代替了“myword”.(需要注意的是在第二個和第三個分隔字元之間沒有空格)。
以這種方式使用Perl的話,當你修改設定檔或其它任何類型的資料的時候,你就會極具創造力。它就是一個自動搜尋和代替的功能。
【轉載】perl修改原檔案內容