我有以下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文件不会嵌套,并且会包含简单的值,例如纯字符串和数字。
答案 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