web-dev-qa-db-ja.com

bashスクリプトを使用して構成ファイルを変更する

キーと値のペアのセットを含む設定ファイルを変更するためのbashスクリプトを書いています。キーを読み取って値を見つけ、場合によっては変更するにはどうすればよいですか?

44

単一の値を変更するための暗闇での野生の刺:

sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE

ターゲットキーと置換値に特別な正規表現文字が含まれておらず、キーと値の区切りが「=」であると仮定します。 -cオプションはシステムに依存するため、sedを実行するために省略しなければならない場合があります。

同様の置換を行う方法に関する他のヒント(例:REPLACEMENT_VALUEに '/'文字が含まれている場合)、 ここにいくつかの素晴らしい例があります

91
Cascabel

これが誰かを助けることを願っています。自己完結型のスクリプトを作成しました。これには、並べ替えの構成処理が必要です。

#!/bin/bash
CONFIG="/tmp/test.cfg"

# Use this to set the new config value, needs 2 parameters. 
# You could check that $1 and $2 is set, but I am lazy
function set_config(){
    Sudo sed -i "s/^\($1\s*=\s*\).*\$/\1$2/" $CONFIG
}

# INITIALIZE CONFIG IF IT'S MISSING
if [ ! -e "${CONFIG}" ] ; then
    # Set default variable value
    Sudo touch $CONFIG
    echo "myname=\"Test\"" | Sudo tee --append $CONFIG
fi

# LOAD THE CONFIG FILE
source $CONFIG

echo "${myname}" # SHOULD OUTPUT DEFAULT (test) ON FIRST RUN
myname="Erl"
echo "${myname}" # SHOULD OUTPUT Erl
set_config myname $myname # SETS THE NEW VALUE
13
Rudi Strydom

key=valueの周りにスペースがある可能性のある=ペアのファイルがあると仮定すると、awkを使用しても自由にキーと値のペアを削除、変更、または追加できます。キーまたは値には特別な正規表現シーケンスが含まれます。

# Using awk to delete, modify or append keys
# In case of an error the original configuration file is left intact
# Also leaves a timestamped backup copy (omit the cp -p if none is required)
CONFIG_FILE=file.conf
cp -p "$CONFIG_FILE" "$CONFIG_FILE.orig.`date \"+%Y%m%d_%H%M%S\"`" &&
awk -F '[ \t]*=[ \t]*' '$1=="keytodelete" { next } $1=="keytomodify" { print "keytomodify=newvalue" ; next } { print } END { print "keytoappend=value" }' "$CONFIG_FILE" >"$CONFIG_FILE~" &&
mv "$CONFIG_FILE~" "$CONFIG_FILE" ||
echo "an error has occurred (permissions? disk space?)"
3
vladr
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/\1\2$replace/" configfile
2
ghostdog74

一般に、grepとcutを使用して情報を抽出するのは簡単です。


cat "$FILE" | grep "^${KEY}${DELIMITER}" | cut -f2- -d"$DELIMITER"

更新するには、次のようなことができます:


mv "$FILE" "$FILE.bak"
cat "$FILE.bak" | grep -v "^${KEY}${DELIMITER}" > "$FILE"
echo "${KEY}${DELIMITER}${NEWVALUE}" >> "$FILE"

これは明らかにキーと値のペアの順序を維持しません。エラーチェックを追加して、データが失われないようにします。

0
user295953