在bash中合并两个json(无jq)

在bash中合并两个json(无jq),bash,terminal,cat,Bash,Terminal,Cat,我有两个JSON: env.json { "environment":"INT" } roles.json { "run_list":[ "recipe[splunk-dj]", "recipe[tideway]", "recipe[AlertsSearch::newrelic]", "recipe[AlertsSearch]" ] } 预期输出应该是这样的: { "environment":"I

我有两个JSON:

env.json

{  
   "environment":"INT"
}
roles.json

{  
   "run_list":[  
      "recipe[splunk-dj]",
      "recipe[tideway]",
      "recipe[AlertsSearch::newrelic]",
      "recipe[AlertsSearch]"
   ]
}
预期输出应该是这样的:

{  
       "environment":"INT",
    "run_list":[  
          "recipe[splunk-dj]",
          "recipe[tideway]",
          "recipe[AlertsSearch::newrelic]",
          "recipe[AlertsSearch]"
       ]
    }
我需要仅使用可用的内置bash命令将这两个json(以及其他类似的json)合并为一个json


只有sed、cat、echo、tail、wc可供我使用

有点老套,但希望可以

env_lines=`wc -l < $1`
env_output=`head -n $(($env_lines - 1)) $1`
roles_lines=`wc -l < $2`
roles_output=`tail -n $(($roles_lines - 1)) $2`
echo "$env_output" "," "$roles_output"
env_line=`wc-l<$1`
环境输出=`head-n$($env_-lines-1))$1`
角色线=`wc-l<$2`
角色输出=`tail-n$($roles\u line-1))$2`
回显“$env\u输出”“”“$roles\u输出”

告诉在项目上设置约束“bash only”的人,
bash
不足以处理JSON,然后获取


我也不能使用
jq
,因为我受到了限制,因为客户的网络主机使用有限的二进制文件在命令行上囚禁用户,这与大多数折扣/经销商网络托管公司所做的一样。幸运的是,他们通常有
PHP
可用,您可以执行类似于我在install/setup bash脚本中放置的命令的一行命令

php-r'$json1=“./env.json”$json2=“./roles.json”$数据=数组合并(json解码(文件获取内容($json1),true),json解码(文件获取内容($json2),true));echo json_encode($data,json_PRETTY_PRINT);'
为了清楚起见,
php-r
也接受换行符,所以使用它也可以

php-r'
$json1=“/env.json”;
$json2=“./roles.json”;
$data=array\u merge(json\u decode(文件获取内容($json1),true),json\u decode(文件获取内容($json2),true));
echo json_encode($data,json_PRETTY_PRINT);'
输出
{
“环境”:“INT”,
“运行列表”:[
“配方[splunk dj]”,
“配方[潮汐]”,
“配方[AlertsSearch::newrelic]”,
“配方[AlertsSearch]”
]
}

@Kusalananda-你说得对,所以我把它们从考虑范围中删除了。正在查看命令。@TomFenech-无法使用jq。只是bash的内置命令。如果您只想使用pure
bash
,那么必须在pure
bash
中编写JSON解析器。祝你好运。即使是猫也不是纯粹的bash;这是一个外部命令。不,你不能。您需要开始阅读第一部分,并找出顶层对象的最后一个关键点之间的分界线,以便插入第二部分。这就是所谓的“解析”,它不是一个简单的过程。如果操作是可信的,你就不能使用
cat
head
tail
、或
wc
@asenovm谢谢,我相信这些命令对我来说是可用的,但在以下情况下失败:cat:{:没有这样的文件或目录cat:“run_list”:[:没有这样的文件或目录cat:“recipe[splunk dj],:无此类文件或目录cat:“recipe[tideway],:无此类文件或目录cat:“recipe[AlertsSearch::newrelic],:无此类文件或目录cat:“recipe[AlertsSearch]”:无此类文件或目录cat::无此类文件或目录cat:“环境”:“INT”,:无此类文件或目录cat:“3scale”:{:没有这样的文件或目录cat:“提供程序密钥”:>“dee9b91dc184afdc8adb6fa79f9ede11",:否such@Scooby,编辑了我的答案,很抱歉弄错了,再试一次。@asenovm-这很好用,你能把env.son和roles.json作为输入参数,并把它放到bash文件中,这样它就可以用于任何两个json吗?这是一个愚蠢的答案,并没有回答我的问题。我知道jq对这很有帮助,但没有什么是完美的rywhere和您可能会遇到无法使用jq的情况。如果处理JSON很重要,请使用正确的工具来处理它。是的,我喜欢这些回答:“嗯,你不应该这样做,所以去解雇你的经理、团队领导和高级团队成员,这样公司外的人就可以告诉他们如何做。”非常有用。
$ jq --slurp 'add' env.json roles.json