你不能輕易做這一切在一個單一的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
有你應該做的,使上述更強大的幾件事情,但是:
你的正則表達式是不固定的,這意味着即試圖設置「端口」也將查找/更改「支持」等
它不會匹配,如果配置文件可能有標籤以及空格
如果重置值在其中有斜槓,則失敗。
如果文件路徑包含空格或shell元字符,則應始終引用參數擴展如$CONFIG_FILE
。
它的安全在這種情況下,但是當你想要一個反斜槓潛在的混亂在雙引號字符串使用單反斜線。當它不識別後面的特殊序列時,外殼會讓它們獨自一人,但如果將它們加倍,它會更清晰。
是什麼-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
對不起,-c也是鏈接文章中的問題,不應該按照原樣複製/粘貼。對我也不起作用。 – Jeff
謝謝你的回答。我真的希望有一個單線,但我擔心這是一個限制。 – Jeff
你可以做一個單通帶'awk'(或'perl'或類似),而不是'sed'。 –