Ich habe eine Datei some.properties
, die eine Datei ist, die Parameter hat.
DATABASE_NAME=${DB_NAME}
DATABASE_HOST=${DB_HOST}
..
..
..
Ich habe eine andere Datei, die demo.json
eine Datei ist und Werte hat:
{
"database_conf" : {
"DB_NAME": "ABC",
"DB_HOST": "HOST_ABC",
"..": "..",
"...": "..."
}
}
So schreiben Sie eine Shell-Skriptdatei, um die some.properties
Datei mit den in der Datei angegebenen Werten zu aktualisieren demo.json
.
Deine Hilfe wird hoch geschätzt.
Antwort1
Analysieren Sie das JSON-Dokument, um jq
ein sed
Skript zu erstellen, und führen Sie dieses Skript dann für Ihre Datei aus:
$ jq -r '.database_conf | to_entries | .[] | "s,=\\${\(.key)},=\"\(.value)\","' demo.json | sed -f /dev/stdin some.properties
DATABASE_NAME="ABC"
DATABASE_HOST="HOST_ABC"
..
..
..
Der jq
Ausdruck erstellt einen sed
Ausdruck für jedes Schlüssel-Wert-Paar im .database_conf
Objekt. Die Ausgabe jq
für die angegebenen Daten ist das folgende sed
Skript:
s,=\${DB_NAME},="ABC",
s,=\${DB_HOST},="HOST_ABC",
s,=\${..},="..",
s,=\${...},="...",
Dies wird dann gelesen, sed -f
um die eigentlichen Ersetzungen in der Eigenschaftendatei durchzuführen.
Dies setzt voraus, dass alle Variablen in der Eigenschaftendatei so geschrieben sind ${variablename}
und dass ihnen immer unmittelbar ein =
Zeichen vorangestellt ist.
Um die Änderungen direkt vorzunehmen, können Sie verwenden sed -i
, andernfalls leiten Sie das Ergebnis in eine neue Datei um.
Wenn Ihre Daten Kommas enthalten, ändern Sie die Kommas im Ausgabeausdruck jq
in ein anderes Zeichen, das in Ihren Daten nicht verwendet wird.
Wenn Sie zusätzliche Top-Level-Objekte mit Konfiguration haben, fügen Sie diese als Komma-getrennte Liste am Anfang des jq
Ausdrucks hinzu. Beispiel:
jq -r '.application_conf, .database_conf | to_entries (..etc..)
Antwort2
Es gibt geeignetere Tools zum Umgang mit JSON-Dateien. Für diesen einfachen Fall awk
reicht möglicherweise Folgendes aus:
awk '
NR == FNR {gsub (/[ ",]/, _) # in first file, remove "punctuation" chars
T[$1] = $2 # and save replacement values in T array
next
}
{P = $2 # create pattern
gsub (/[${}]/, _, P) # with redundant / undesired chars removed
}
P in T {sub (P, T[P], $2) # if pattern shows up, replace it
}
1
' FS=":" file2 FS="=" file1
DATABASE_NAME ${ABC}
DATABASE_HOST ${HOST_ABC}