在bash中合并两个json(没有jq)

Merge two json in bash (no jq)

我有两个 jsons :

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。

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

有点老套,但希望可以。

env_lines=`wc -l < `
env_output=`head -n $(($env_lines - 1)) `
roles_lines=`wc -l < `
roles_output=`tail -n $(($roles_lines - 1)) `
echo "$env_output" "," "$roles_output"

告诉对项目施加约束 "bash only" 的人 bash 不足以处理 JSON,并得到 jq.

$ jq --slurp 'add' env.json roles.json

我也无法使用 jq,因为我受到限制,因为大多数 discount/reseller 网络托管公司都这样做,因为客户端的虚拟主机在命令行上使用有限的二进制文件来限制用户。幸运的是,他们通常有 PHP 可用,您可以执行这样的 oneliner 命令,例如我将在 install/setup bash 脚本中放置的内容。

php -r '$json1 = "./env.json";$json2 = "./roles.json";$data = array_merge(json_decode(file_get_contents($json1), true),json_decode(file_get_contents($json2),true));echo json_encode($data, JSON_PRETTY_PRINT);'

为清楚起见,php -r 也接受换行,因此使用它也可以。

php -r '
$json1 = "./env.json";
$json2 = "./roles.json";
$data = array_merge(json_decode(file_get_contents($json1), true), json_decode(file_get_contents($json2), true));
echo json_encode($data, JSON_PRETTY_PRINT);'

输出

{
    "environment": "INT",
    "run_list": [
        "recipe[splunk-dj]",
        "recipe[tideway]",
        "recipe[AlertsSearch::newrelic]",
        "recipe[AlertsSearch]"
    ]
}