2012-10-08 35 views
1

我有一個配置文件填充設置。就像一堆設置。我想知道如何自動化替換例如:正確的方式來使用bash替換文件中的文本

我有LF_ALERT_TO = "",我想添加一個電子郵件。

問題二:

我可以使用選擇只抓住該電子郵件?例如:

./run --email [email protected] 

我當前的代碼佈局:

wget http://www.configserver.com/free/csf.tgz 
tar -zxvf csf.tgz 
cd csf 
./install.sh 
(modifiy values in /etc/csf/csf.conf 
+0

有什麼預期的輸出? 'LF_ALERT_TO =「[email protected]」'? – Kent

+0

是的,就像那樣。 –

回答

3

如果我理解正確的話,你可以使用SED該任務,假設電子郵件存儲在$EMAILVAR環境變量:

sed -i -e "s/\\(LF_ALERT_TO[ \\t]*=[ \\t]*\"\\)[^\"]*\"/\\1$EMAILVAR\"/" config.txt 

這裏我們告訴sed替換一個包含(按順序)的字符串:

  1. LF_ALERT_TO
  2. 的空間和/或突出部([ \t]*
  3. =
  4. 的空間和/或突出部
  5. "
  6. 不在"個字符的序列與另一種序列的序列( [^"]*
  7. "

項目1-5位於反斜槓括號之間。這形成了一個捕獲組,所以它們匹配的內容被存儲在一個名爲\1的輔助「變量」中。

然後我們生成組成的字符串:

  1. \1,即。什麼匹配步驟1-5以上
  2. 所需的電子郵件
  3. 的關閉"(因爲它沒有被捕獲)

我們使用-i國旗在命令告訴sed來編輯一個文件(即使用config.txt作爲輸入執行命令,然後將輸出存儲在同一文件的頂部)。

希望這會有所幫助=)

+0

好的。我想我明白了。將變量放在電子郵件的位置會有多難?如果我想查找並替換一個數字,我只需要修改步驟6,在那裏查找字符串內部? –

+0

不難,用雙引號替換單引號,而不是「[email protected]」,放置「$ EMAILVAR」。爲了清晰起見,我將編輯帖子。至於第6步,確切地說,你可以在那裏放置一個正則表達式模式來匹配你想要的任何東西(比如'[0-9] *'的數字)。 =) –

+0

對不起,我忘了提。從單引號更改爲雙引號時,還必須反斜槓內部雙引號。反斜槓原始反斜槓也是一個好主意=) –

1

您是否需要在一個文件中進行替換?如果是這樣,你可以考慮使用vim。 查找/替換命令如下:

%s/LF_ALERT_TO = ""/LF_ALERT_TO = "[email protected]"/g 

如果您需要在一堆你可以考慮使用以下命令文件替換:如果您在csf.conf想LF_ALERT_TO = "[email protected]"

find path_to_find -iname "filemask" -exec sed -i 's/LF_ALERT_TO = ""/LF_ALERT_TO = "[email protected]/g" {} \; 
2

sed -i 's/LF_ALERT_TO = ""/LF_ALERT_TO = "[email protected]"/g' csf.conf 

應該工作。

,如果你想通過電子郵件作爲變量:

kent$ cat csf.conf 
foo 
LF_ALERT_TO = "" 
foo 
bar 
whatever 
kent$ em="[email protected]" 

kent$ sed "s/LF_ALERT_TO = \"\"/LF_ALERT_TO = \"$em\"/g" csf.conf 
foo 
LF_ALERT_TO = "[email protected]" 
foo 
bar 
whatever 

sed -i "..." csf.conf will change the original file.

相關問題