[英]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.