[英]Append or modify keys in conf files using sed/bash one-liner
我經常不得不修改sysctl.conf
文件,並且我熟悉使用sed替換現有值。
如果sed無法替換新的鍵/值對,是否可以將其添加到文件?
例如,使用此示例: 使用bash腳本修改配置文件
sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE
如何使用相同的sed表達式對$TARGET_KEY = $REPLACEMENT_VALUE
新行添加到$CONFIG_FILE
,但要稍作更改?
在一個相關的主題上,如果$CONFIG_FILE
不存在,該如何強制它創建呢?
您無法在單個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
但是,您可能需要做一些事情來使上述內容更可靠:
您的正則表達式未錨定,這意味着嘗試設置“ PORT”也會發現/更改“ SUPPORT”等。
如果配置文件可能包含制表符和空格,則不會匹配
如果替換值中包含斜杠,則失敗。
如果文件路徑包含空格或外殼程序元字符,則應始終引用$CONFIG_FILE
類的參數擴展名。
在這種情況下是安全的,但是如果您想要文字反斜杠,則在雙引號字符串中使用單反斜杠可能會造成混淆。 當外殼無法識別它們后面的特殊序列時,它們將它們留給它們,但是如果將它們加倍,它將更加清晰。
-c
對您的sed版本有什么作用? 我的Linux和Mac版本都不支持該選項。
因此,我將以這種方式進行操作( ^I
代表文字制表符,而^A
代表文字control-A字符,例如通過在命令行上首先鍵入control-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
使用下面的偽代碼:
if (grep -q key); then
sed...
else
echo key=value >> $CONFIG_FILE
fi
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.