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

如何用jq过滤和替换json中的值,json,jq,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"

我在使用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"
}
to_entries | map(select(.value.name|strings|contains("CHANNEL1"))) | [foreach .[] as $keyvalue (99; .+1; { key: $keyvalue.key, value: ($keyvalue.value + {"x-channelID": .})})] | from_entries
为了重新编号,我测试了下面的函数,它运行良好

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"
  }
}

谢谢你的帮助

您可以使用以下选项:

{
  "_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"
}
to_entries | map(select(.value.name|strings|contains("CHANNEL1"))) | [foreach .[] as $keyvalue (99; .+1; { key: $keyvalue.key, value: ($keyvalue.value + {"x-channelID": .})})] | from_entries
将对象映射到{key:key,value:value}项数组中

mapselectfilter筛选值与条件匹配的对象

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

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


您可以。

您可以使用以下选项:

{
  "_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"
}
to_entries | map(select(.value.name|strings|contains("CHANNEL1"))) | [foreach .[] as $keyvalue (99; .+1; { key: $keyvalue.key, value: ($keyvalue.value + {"x-channelID": .})})] | from_entries
将对象映射到{key:key,value:value}项数组中

mapselectfilter筛选值与条件匹配的对象

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

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


您可以。

评论不用于扩展讨论;此对话已结束。评论不用于扩展讨论;这段对话已经结束。