sed
1回の呼び出しですべてを簡単に行うことはできません。それを2つのステップにするのがおそらく最も簡単です:
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
ファイルパスにスペースやシェルメタ文字が含まれている場合は、常に、のようなパラメータ展開を引用する必要があります。
この場合は安全ですが、リテラルの円記号が必要な場合に、二重引用符で囲まれた文字列で単一の円記号を使用すると混乱する可能性があります。シェルは、その後に続くものを特別なシーケンスとして認識しない場合、それらをそのままにしますが、それらを2倍にするとより明確になります。
-c
あなたのバージョンのsedはどうしますか?私のLinuxバージョンもMacバージョンもそのようなオプションをサポートしていません。
だから私はこのようにします(^I
'sはリテラルタブ文字を表し、^A
'sリテラル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