用bash中的相应环境变量用键替换json值

时间:2019-02-23 18:04:20

标签: bash unix

我有以下json

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

如果键的值存在于环境变量中,我想仅通过使用Unix命令来代替它们,而不能使用jq之类的外部软件包或lib。 例如:

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

这是我的 script_to_execute 文件

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

编辑 收到答案和评论后,我意识到我没有清楚地强调自己的需求。我需要执行此任务,而不使用高山分发中未包含的外部依赖项。我的json文件不会嵌套,并且会包含简单的值,例如纯字符串和数字。

3 个答案:

答案 0 :(得分:2)

这在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

一样使用

答案 1 :(得分:2)

Perl,使用来自CPAN的JSON模块:

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

答案 2 :(得分:0)

如果您改变主意和您的要求,以下是Shell脚本示例,说明如何使用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