Substitua os valores dos parâmetros em um arquivo (.properties) pelos valores de outro arquivo (.json)

Substitua os valores dos parâmetros em um arquivo (.properties) pelos valores de outro arquivo (.json)

Eu tenho um arquivo que é some.propertiesarquivo, que possui parâmetros.

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

Eu tenho outro arquivo que é demo.jsonarquivo e tem valores:

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

Como escrever um arquivo shell script para atualizar o some.propertiesarquivo com os valores mencionados no demo.jsonarquivo.

Sua ajuda é muito apreciada.

Responder1

Analise o documento JSON para jqcriar um sedscript 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 jqexpressão criará uma sedexpressão para cada par de valores-chave no .database_confobjeto. A saída dos jqdados fornecidos será o seguinte sedscript:

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

Isso é então lido sed -fpara 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 jqpara 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 jqexpressã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, awkpode 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}

informação relacionada