Eu tenho um arquivo que é some.properties
arquivo, que possui parâmetros.
DATABASE_NAME=${DB_NAME}
DATABASE_HOST=${DB_HOST}
..
..
..
Eu tenho outro arquivo que é demo.json
arquivo e tem valores:
{
"database_conf" : {
"DB_NAME": "ABC",
"DB_HOST": "HOST_ABC",
"..": "..",
"...": "..."
}
}
Como escrever um arquivo shell script para atualizar o some.properties
arquivo com os valores mencionados no demo.json
arquivo.
Sua ajuda é muito apreciada.
Responder1
Analise o documento JSON para jq
criar um sed
script e execute esse script em seu arquivo:
$ jq -r '.database_conf | to_entries | .[] | "s,=\\${\(.key)},=\"\(.value)\","' demo.json | sed -f /dev/stdin some.properties
DATABASE_NAME="ABC"
DATABASE_HOST="HOST_ABC"
..
..
..
A jq
expressão criará uma sed
expressão para cada par de valores-chave no .database_conf
objeto. A saída dos jq
dados fornecidos será o seguinte sed
script:
s,=\${DB_NAME},="ABC",
s,=\${DB_HOST},="HOST_ABC",
s,=\${..},="..",
s,=\${...},="...",
Isso é então lido sed -f
para realizar as substituições reais no arquivo de propriedades.
Isso pressupõe que toda e qualquer variável no arquivo de propriedades seja escrita como ${variablename}
e que seja sempre imediatamente precedida por um =
caractere.
Para fazer as alterações no local, você pode usar sed -i
, caso contrário, redirecione o resultado para um novo arquivo.
Se seus dados contiverem vírgulas, altere as vírgulas na expressão de saída jq
para algum outro caractere que não seja usado em seus dados.
Se você tiver objetos de nível superior adicionais com configuração, adicione-os como uma lista delimitada por vírgulas no início da jq
expressão. Por exemplo:
jq -r '.application_conf, .database_conf | to_entries (..etc..)
Responder2
Existem ferramentas mais apropriadas para lidar com arquivos JSON. Para este caso simples, awk
pode 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}