繁体   English   中英

使用sed / bash一线追加或修改conf文件中的密钥

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

但是,您可能需要做一些事情来使上述内容更可靠:

  1. 您的正则表达式未锚定,这意味着尝试设置“ PORT”也会发现/更改“ SUPPORT”等。

  2. 如果配置文件可能包含制表符和空格,则不会匹配

  3. 如果替换值中包含斜杠,则失败。

  4. 如果文件路径包含空格或外壳程序元字符,则应始终引用$CONFIG_FILE类的参数扩展名。

  5. 在这种情况下是安全的,但是如果您想要文字反斜杠,则在双引号字符串中使用单反斜杠可能会造成混淆。 当外壳无法识别它们后面的特殊序列时,它们将它们留给它们,但是如果将它们加倍,它将更加清晰。

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM