Замените значения json на ключ соответствующей переменной среды в bash - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть следующие json

{
  "NODE_ENV" : "production",
  "APP_URL":"test"
}

Я хотел бы заменить значения ключей, если они существуют в переменных среды , используя только команды unix , а не внешний пакет или библиотеку, подобную jq.Например:

$ NODE_ENV=test
$ ./script_to_execute test.json
$ cat test.json
{
  "NODE_ENV" : "test",
  "APP_URL":"test"
}

Это мой script_to_execute file

#!/bin/bash
for env in $(compgen -v) ; do
    sed -i 's/^\("$env":"\)[^"]*/\1${!env}/' $1
done

EDIT После получения ответов и комментариев я понял, что у меня нетЯ четко подчеркиваю мои потребности.Мне нужно выполнить эту задачу без использования внешних зависимостей, кроме включенных в альпийский дистрибутив.Мой файл json не будет вложенным и будет содержать простые значения, такие как простые строки и числа.

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Perl, использует модуль JSON из CPAN:

perl -MJSON -0777 -lne '
    my $data = decode_json $_;
    for my $key (keys %$data) {
        $data->{$key} = $ENV{$key} if exists $ENV{$key};
    }
    print encode_json($data);
' file.json

или Ruby, без внешних зависимостей

ruby -rjson -e '
    data = JSON.parse(File.read(ARGV.shift))
    data.each_key {|key| data[key] = ENV[key] if ENV.has_key? key}
    puts JSON.generate(data)
' file.json
0 голосов
/ 24 февраля 2019

Если вы передумаете и ваши требования вот пример сценария оболочки, как вы могли бы сделать это, используя jq .

#!/bin/sh
for key in `jq "keys | .[]" $1 | xargs` ; do
    eval "_TO_CHECK=\$$key" ## 
    if [ "$_TO_CHECK" ]; then
       jq ".$key=\"$_TO_CHECK\"" $1 > _temp.json && mv _temp.json $1
    fi
done
0 голосов
/ 23 февраля 2019

Это действительно просто в Python:

#!/usr/bin/env python

import json
import os
import sys

olddata = json.load(sys.stdin)
newdata = {k: os.environ.get(k, v) for k, v in olddata.items()}
json.dump(newdata, sys.stdout, indent=2)

Используйте это как ./update_from_env.py < test.json > new.json; mv new.json test.json

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...