您无法在一次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”等。
如果配置文件可能有制表符和空格,它将不匹配
如果替换值中有斜线,则失败。
如果文件路径包含空格或 shell 元字符,您应该始终引用参数扩展$CONFIG_FILE
,例如。
在这种情况下是安全的,但是当您需要文字反斜杠时,在双引号字符串中使用单个反斜杠可能会造成混淆。当 shell 无法识别其后的特殊序列时,shell 会将它们单独放置,但如果将它们加倍会更清楚。
你的 sed 版本有什么作用-c
?我的 Linux 和 Mac 版本都不支持这样的选项。
所以我会这样做(^I
's 代表文字制表符,而^A
's 文字 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