我经常要修改的文件,如sysctl.conf
,我很熟悉使用SED替换现有的值。
有没有一种方法来追加新的键/值对的文件,如果用sed无法取代它呢?
举例来说,使用这个例子: 使用bash脚本修改配置文件
sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE
我怎么能添加$TARGET_KEY = $REPLACEMENT_VALUE
新行$CONFIG_FILE
使用略有改动同样SED体现在哪里?
并在相关的话题,我怎么能强迫的创作$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
有几件事情你应该做的,使上面的更稳健,但是:
正则表达式是不固定的,这意味着试图设置“端口”也将查找/更改“支持”,等等。
它不会匹配,如果配置文件可能有标签以及空格
如果重置价值有斜杠在它失败。
你应该总是报价参数扩展像$CONFIG_FILE
,如果文件路径包含空格或shell元字符。
它是安全的。这种情况下,但可能混淆当你想要一个反斜杠使用单反斜杠在双引号字符串。 壳留给他们独处的时候不承认后,随之而来的特殊序列,但如果你加倍他们来说会比较清楚。
什么-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
使用下面的伪代码:
if (grep -q key); then
sed...
else
echo key=value >> $CONFIG_FILE
fi