Ersetzen Sie Parameterwerte in einer Datei (.properties) durch Werte aus einer anderen Datei (.json).

Ersetzen Sie Parameterwerte in einer Datei (.properties) durch Werte aus einer anderen Datei (.json).

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.jsoneine Datei ist und Werte hat:

{
  "database_conf" : {
    "DB_NAME": "ABC",
    "DB_HOST": "HOST_ABC",
    "..": "..",
    "...": "..."
  }
}

So schreiben Sie eine Shell-Skriptdatei, um die some.propertiesDatei mit den in der Datei angegebenen Werten zu aktualisieren demo.json.

Deine Hilfe wird hoch geschätzt.

Antwort1

Analysieren Sie das JSON-Dokument, um jqein sedSkript 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 jqAusdruck erstellt einen sedAusdruck für jedes Schlüssel-Wert-Paar im .database_confObjekt. Die Ausgabe jqfür die angegebenen Daten ist das folgende sedSkript:

s,=\${DB_NAME},="ABC",
s,=\${DB_HOST},="HOST_ABC",
s,=\${..},="..",
s,=\${...},="...",

Dies wird dann gelesen, sed -fum 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 jqin 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 jqAusdrucks 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 awkreicht 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}

verwandte Informationen