2009-08-13 122 views
1

我試圖編寫一個shell腳本,在啓動時執行搜索並在配置文件中進行替換。如何從shell腳本中搜索和替換文件中的文本?

我們試圖替換字符串是:

include /etc/nginx/https.include; 

,我們想用一個註釋版本來替換它:

#include /etc/nginx/https.include; 

包含我們要替換的字符串的文件是:

/etc/nginx/app-servers.include 

我不是一個Linux的大師,似乎無法找到的命令來做到這一點。

+0

這對於serverfault.com,imho更合適。 – 2009-08-13 18:55:03

+0

我不明白爲什麼它適合serverfault。它似乎與服務器沒有任何關係。它屬於超級用戶。投票結束。 – rmeador 2009-08-13 19:14:44

+0

/bin/sh或bash或csh或任何其他shell是圖靈完整語言。你爲什麼不認爲「如何在Y語言中實現X?」屬於StackOverflow? – dmckee 2009-08-14 02:14:59

回答

7
perl -p -i -e 's%^(include /etc/nginx/https.include;)$%#$1%' /etc/nginx/ap-servers.include 

如果該行可能不會在;結束,則應使用:

perl -p -i -e 's%^(include /etc/nginx/https.include;.*)$%#$1%' /etc/nginx/ap-servers.include 

如果你想保留原始文件,添加一個備份擴展-i後:

perl -p -i.bak -e 's%^(include /etc/nginx/https.include;)$%#$1%' /etc/nginx/ap-servers.include 

現在解釋一下。 -p標誌表示就地替換。文件的所有行都將被輸入到表達式中,結果將被用作替換。 -i標誌表示備份文件的擴展名。通過無任何使用,您可以防止生成備份。 -e告訴Perl獲取以下參數作爲要執行的表達式。

現在,表達式是s%something%other%。我使用%而不是更傳統的/來避免必須避開路徑的斜槓。我在表達式中使用括號並在替代表達式中使用括號 - 如果您更改了一個,則另一個將會跟隨。因此,%#$1%實際上是s第二%,接着是所需的#$1指示在括號內的圖案,以及s最後%

HTH。手。

+0

+1爲解決方案,併爲這種情況下使用另一個更好的字符(%),而不是更傳統的/ – 2009-08-13 18:54:38

2

退房sed

sed -i -r 's|^(include /etc/nginx/https.include;)$|#\1|' /etc/nginx/app-servers.include 

-i手段做替代就地和-r表示使用擴展正則表達式。

0
cd pathname 
for y in `ls *`; 
do sed "s/ABCD/DCBA/g" $y > temp; mv temp $y; 
done 

這個腳本shold替換字符串ABCD到DCBA中的所有文件路徑名

3

的sed -i 'S /富/酒吧/ G' 的config.txt

這取代在文件config.txt中帶有bar的所有實例(不區分大小寫)