私はアプリケーションをインストールし、設定ファイルを更新するために使用する単純なbashスクリプトを書こうとしました。構成ファイルの変更に問題があります。
# DBHost=localhost
DBName=test
# DBPassword=
上記の内容を次のように修正する方法に関する提案はありますか?
DBHost=localhost
DBName=database
DBPassword=password
答え1
最善のアプローチは、人がファイルを変更できるかどうか、ファイルがどれほど複雑であるか、他の人が別の値を望むときにスクリプトを優先するかどうかによって異なります。つまり、ファイルがすでに含まれている場合は、DBPassword=swordfish
そのファイルを保持しますか、またはに置き換えますかDBPassword=password
?
この問題を解決する一般的な方法は、「魔法のコメント」を使用してファイルの一部を分離し、これらのコメントの間の部分のみを編集することです。 awkを使用してこれを行う1つの方法は次のとおりです。マジックコメントがない場合は、ファイルの末尾に新しいセクションが追加されます。警告:テストされていないコードです。
begin_marker='# BEGIN AUTOMATICALLY EDITED PART, DO NOT EDIT'
end_marker='# END AUTOMATICALLY EDITED PART'
new_section='DBHost=localhost
DBName=database
DBPassword=password'
export begin_marker end_marker
awk <file.conf >file.conf.new -v begin_marker="$begin_marker" -v begin_marker="$end_marker" -v new_section="$new_section" '
1 {print}
$0 == begin_marker && !changed {
do {getline} while ($0 != end_marker); # discard old section content
print new_section;
print;
changed = 1;
}
END {if (!changed) {print begin_marker; print new_section; print end_marker;}}
'
ln -f file.conf file.conf.old
mv -f file.conf.new file.conf
構成ファイルを読み取るプログラムが同じ構成項目を複数行に設定することをサポートしていない場合、この方法は正しく機能しません。このような場合は、既存のものを削除する必要があります。この場合は、コメントを残して最後に独自の設定を追加することをお勧めします。
grep -vE '^[[:blank:]]*(DBHost|DBName|DBPassword)=$' <file.conf >file.conf.new
cat <<EOF >>file.conf.new
DBHost=localhost
DBName=database
DBPassword=password
EOF
ln -f file.conf file.conf.old
mv -f file.conf.new file.conf
答え2
それがすべてなら、次のようにすることができます。
sed -i.bak -e 's/DBName=.*/DBName=database/' \
-e 's/#* *DBHost=.*/DBHost=localhost/' \
-e 's/#* *DBPassword=.*/DBPassword=password/' config.file
これにより元のファイルがコピーされconfig.file
、config.file.bak
必要な変更が行われます。
答え3
自動モードでは「ex」を使用します。
ex -s $CONFIG_FILE << END_CMDS
%s/^#.DBHost/DBHOST/
%s/DBName=test/DBName=database/
%s/^#.DBPassword/DBPassword/
w!
q
END_CMDS
Terdenのsed
命令は厳密で効率的でした。しかし、exコマンドとシェル文字列の補間で埋められた「document here」の相互作用は非常に強力です。たとえば、パスワードをシェル変数の値に置き換えることができます。
%s/^#.DBPassword=password/DBPassword=$PASSWORD/
「:」パターンを使用してvi
慣れている場合は、vim
新しい/より良い/他の編集内容を追加するのも非常に簡単です。