Tengo un archivo que es some.properties
un archivo que tiene parámetros.
DATABASE_NAME=${DB_NAME}
DATABASE_HOST=${DB_HOST}
..
..
..
Tengo otro archivo que es demo.json
archivo 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.properties
archivo con los valores mencionados en el demo.json
archivo.
Tu ayuda es altamente apreciada.
Respuesta1
Analice el documento JSON para jq
crear un sed
script 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 jq
expresión creará una sed
expresión para cada par clave-valor en el .database_conf
objeto. La salida de jq
los datos proporcionados será el siguiente sed
script:
s,=\${DB_NAME},="ABC",
s,=\${DB_HOST},="HOST_ABC",
s,=\${..},="..",
s,=\${...},="...",
Luego lo lee sed -f
para 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 jq
por 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 jq
expresió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, awk
puede 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}