Der beste Weg hängt davon ab, ob Sie erwarten, dass die Datei auch von Menschen geändert wird, wie komplex die Datei ist und ob Ihr Skript Vorrang haben soll, wenn es so aussieht, als ob jemand anderes einen anderen Wert wünscht. Das heißt, wenn die Datei bereits enthält DBPassword=swordfish
, möchten Sie diese beibehalten oder durch ersetzen DBPassword=password
?
Eine übliche Methode, um damit umzugehen, besteht darin, einen Abschnitt der Datei durch „magische Kommentare“ zu begrenzen und nur den Teil zwischen diesen Kommentaren zu bearbeiten. Hier ist eine Möglichkeit, dies mit awk zu tun. Wenn die magischen Kommentare nicht vorhanden sind, wird der neue Abschnitt am Ende der Datei hinzugefügt. Warnung: ungetesteter Code.
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
Dieser Ansatz funktioniert nicht gut, wenn das Programm, das die Konfigurationsdatei liest, nicht mehrere Zeilen unterstützt, die dasselbe Konfigurationselement festlegen. In diesem Fall müssen Sie die alten wirklich entfernen. In diesem Fall würde ich empfehlen, die Kommentare unberührt zu lassen und am Ende Ihre eigenen Einstellungen hinzuzufügen.
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