如何使用jq过滤和替换json中的值

时间:2019-11-08 09:09:09

标签: json jq

我在使用jq过滤和更新json文件的内容时遇到问题。我需要根据特定值过滤json数据,并根据该过滤条件编辑其他值并增加其他值

我尝试使用

jq '.[] | select (."name"| contains("CHANNEL1"))' 

要过滤,但结果缺少顶部键“ x-ID.0”信息,结果如下:

{
  "_file.name": "filename.ext",
  "name": "CHANNEL1 HD TV",
  "logo": "file.png",
  "x-channelID": "726"
}
{
  "_file.m3u.name": "filename.ext",
  "name": "CHANNEL1 SD",
  "logo": "file.png",
  "x-channelID": "726"
}

对于重新编号,我已经测试了以下功能,并且效果很好

jq -n -s '[ foreach inputs[] as $i (100; .+1; $i*{"x-channelID":(.-1)}) ]'

这是原始的json文件

{
  "x-ID.0": {
    "_file.name": "filename.ext",
    "name": "CHANNEL1 HD TV",
    "logo": "file.png",
    "x-channelID": "726"
  },
   "x-ID.2": {
    "_file.m3u.name": "filename.ext",
    "name": "CHANNEL2",
    "logo": "file.png",
    "x-channelID": "106"
  },
   "x-ID.3": {
    "_file.m3u.name": "filename.ext",
    "name": "CHANNEL3 SD",
    "logo": "file.png",
    "x-channelID": "236"
  },
   "x-ID.4": {
    "_file.m3u.name": "filename.ext",
    "name": "CHANNEL1 SD",
    "logo": "file.png",
    "x-channelID": "726"
  },
   "x-ID.5": {
    "_file.m3u.name": "filename.ext",
    "name": "CHANNEL2 HD",
    "logo": "file.png",
    "x-channelID": "726"
  }
}

这是预期的结果

{
  "x-ID.0": {
    "_file.m3u.name": "filename.ext",
    "name": "CHANNEL1 HD",
    "logo": "CHANNEL1.png",
    "x-channelID": "100"
  },
   "x-ID.4": {
    "_file.m3u.name": "filename.ext",
    "name": "CHANNEL1 SD",
    "logo": "CHANNEL1.png",
    "x-channelID": "101"
  }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

to_entries | map(select(.value.name|strings|contains("CHANNEL1"))) | [foreach .[] as $keyvalue (99; .+1; { key: $keyvalue.key, value: ($keyvalue.value + {"x-channelID": .})})] | from_entries

to_entries将您的对象映射到{ key: "key", value: "value" }个项目的数组中。

map(select(filter))过滤那些符合您条件的值。

然后,我们使用foreach递增计数器,同时迭代其余的键/值对,并使用计数器更新值的x-channelID字段。

最后,我们使用from_entries从键/值对数组中重新创建所需的对象。

您可以try it here