2012-11-19 26 views
2

我經常要修改這些文件作爲sysctl.conf,我很熟悉使用SED替換現有的值。追加或使用SED/bash的一個班輪修改conf文件鍵

有沒有辦法爲新的鍵/值對追加到該文件,如果用sed無法取代它呢?

舉例來說,使用這個例子:modify config file using bash script

sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE 

我如何可以添加使用略有改動同樣SED表達$TARGET_KEY = $REPLACEMENT_VALUE新線$CONFIG_FILE

而且在相關的話題,我怎麼能強迫的$CONFIG_FILE創作如果不存在呢?

回答

4

你不能輕易做這一切在一個單一的sed電話。這可能是最簡單的,使其兩個步驟:

if grep -q "$TARGET_KEY *= " $CONFIG_FILE; then 
    sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE 
else 
    echo "$TARGET_KEY = $REPLACEMENT_VALUE" >>$CONFIG_FILE 
fi 

有你應該做的,使上述更強大的幾件事情,但是:

  1. 你的正則表達式是不固定的,這意味着即試圖設置「端口」也將查找/更改「支持」等

  2. 它不會匹配,如果配置文件可能有標籤以及空格

  3. 如果重置值在其中有斜槓,則失敗。

  4. 如果文件路徑包含空格或shell元字符,則應始終引用參數擴展如$CONFIG_FILE

  5. 它的安全在這種情況下,但是當你想要一個反斜槓潛在的混亂在雙引號字符串使用單反斜線。當它不識別後面的特殊序列時,外殼會讓它們獨自一人,但如果將它們加倍,它會更清晰。

  6. 是什麼-c做你的sed的版本?我的Linux或Mac版本都不支持這種選項。

因此,我將做這種方式(在^I的代表文字製表符,和^A的字面控制-A字符,通過例如在命令行上第一輸入控制-V輸入):

if grep -q "^[ ^I]*$TARGET_KEY[ ^I]*=" "$CONFIG_FILE"; then 
    sed -i -e "s^A^\\([ ^I]*$TARGET_KEY[ ^I]*=[ ^I]*\\).*$^A\\1$REPLACEMENT_VALUE^A" "$CONFIG_FILE" 
else 
    echo "$TARGET_KEY = $REPLACEMENT_VALUE" >> "$CONFIG_FILE" 
fi 
+0

對不起,-c也是鏈接文章中的問題,不應該按照原樣複製/粘貼。對我也不起作用。 – Jeff

+0

謝謝你的回答。我真的希望有一個單線,但我擔心這是一個限制。 – Jeff

+0

你可以做一個單通帶'awk'(或'perl'或類似),而不是'sed'。 –

0

使用下面的僞代碼:

if (grep -q key); then 
    sed... 
else 
    echo key=value >> $CONFIG_FILE 
fi