Reemplazar valores de parámetros en un archivo (.properties) a partir de valores de otro archivo (.json)

Reemplazar valores de parámetros en un archivo (.properties) a partir de valores de otro archivo (.json)

Tengo un archivo que es some.propertiesun archivo que tiene parámetros.

DATABASE_NAME=${DB_NAME}
DATABASE_HOST=${DB_HOST}
..
..
..

Tengo otro archivo que es demo.jsonarchivo y tiene valores:

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

Cómo escribir un archivo de script de shell para actualizar el some.propertiesarchivo con los valores mencionados en el demo.jsonarchivo.

Tu ayuda es altamente apreciada.

Respuesta1

Analice el documento JSON para jqcrear un sedscript y luego ejecute ese script en su archivo:

$ jq -r '.database_conf | to_entries | .[] | "s,=\\${\(.key)},=\"\(.value)\","' demo.json | sed -f /dev/stdin some.properties
DATABASE_NAME="ABC"
DATABASE_HOST="HOST_ABC"
..
..
..

La jqexpresión creará una sedexpresión para cada par clave-valor en el .database_confobjeto. La salida de jqlos datos proporcionados será el siguiente sedscript:

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

Luego lo lee sed -fpara realizar las sustituciones reales en el archivo de propiedades.

Esto supone que todas y cada una de las variables del archivo de propiedades están escritas como ${variablename}y que siempre están inmediatamente precedidas por un =carácter.

Para realizar los cambios in situ, es posible que desee utilizar sed -i; de lo contrario, redirija el resultado a un archivo nuevo.

Si sus datos contienen comas, cambie las comas en la expresión de salida jqpor algún otro carácter que no se use en sus datos.

Si tiene objetos de nivel superior adicionales con configuración, agréguelos como una lista delimitada por comas al comienzo de la jqexpresión. Por ejemplo:

jq -r '.application_conf, .database_conf | to_entries (..etc..)

Respuesta2

Existen herramientas más apropiadas para manejar archivos JSON. Para este caso sencillo, awkpuede ser suficiente:

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}

información relacionada