追加或使用SED / bash的一个班轮修改conf文件键(Append or modify key

2019-08-02 22:28发布

我经常要修改的文件,如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如果不存在呢?

Answer 1:

你不能轻易地做到这一切在一个单一的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

有几件事情你应该做的,使上面的更稳健,但是:

  1. 正则表达式是不固定的,这意味着试图设置“端口”也将查找/更改“支持”,等等。

  2. 它不会匹配,如果配置文件可能有标签以及空格

  3. 如果重置价值有斜杠在它失败。

  4. 你应该总是报价参数扩展像$CONFIG_FILE ,如果文件路径包含空格或shell元字符。

  5. 它是安全的。这种情况下,但可能混淆当你想要一个反斜杠使用单反斜杠在双引号字符串。 壳留给他们独处的时候不承认后,随之而来的特殊序列,但如果你加倍他们来说会比较清楚。

  6. 什么-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


Answer 2:

使用下面的伪代码:

if (grep -q key); then
    sed...
else
    echo key=value >> $CONFIG_FILE
fi


文章来源: Append or modify keys in conf files using sed/bash one-liner