首页 > 解决方案 > jq - 添加使用外部命令计算的条目

问题描述

我的输入:

{
  "data": [
    {
      "Name": "name 1",
      "Url": "https://some-content.com"
    },
    {
      "Name": "name 2",
      "Url": "https://soming-else.com"
    }
}

我想检查content-type每个对象Url并将curl其添加到每个对象中。所以,我会得到:

{
  "data": [
    {
      "Name": "name 1",
      "Url": "https://some-content.com",
      "ContentType": "video"
    },
    {
      "Name": "name 2",
      "Url": "https://soming-else.com",
      "ContentType": "text"
    }
}

我用来检查content-type响应标头值的命令:

curl -sSL <url> -o /dev/null -w '%{content_type}'

我觉得这xargs是正确的方法,但我还没有弄清楚如何以上述方式将其结果添加到输入 JSON 中。

我也知道 jq 的=|运营商,但我不知道如何得到xrags它的结果。

我的问题有解决方案吗?可以使用我尝试使用的工具来完成吗?

标签: curljqxargs

解决方案


|=对更新输入的相关性是正确的,我假设它在一个名为 input.json 的文件中

不幸的是,正如您已经注意到的,jq 不支持“外部”评估,但这里有一种方法,至少是直接的,只需要两次调用 jq:

while read url ; do
    curl -sSL "$url" -o /dev/null -w '%{content_type}'
done < <(jq -r .data[].Url input.json) | 
jq -Rn --argfile json input.json '
  [inputs] as $in
  | $json
  | .data |= reduce range(0;length) as $i (.;
               .[$i].ContentType = $in[$i])
'

推荐阅读