簡體   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