使用jq修改包含特定字符串的对象中的值。

问题描述 投票:0回答:2

我试图修改一个大的json文件(一个Grafana仪表盘),替换一个单一的值,然后输出整个文件的变化。我如何才能做到这一点?

你可以在这里看到我想要编辑的值。实际的文件相当大,所以还有很多其他的顶层值,但我只需要编辑 "模板 "块下的一个特定项目。

"templating": {
    "list": [
      {
        "allValue": ".*",
        "current": {},
        "datasource": "$Source",
        "hide": 0,
        "includeAll": false,
        "label": null,
        "multi": true,
        "name": "node",
        "options": [],
        "query": "label_values(node_boot_time{env=~\"$env\"}, instance)",
        "refresh": 1,
        "regex": "",
        "sort": 0,
        "tagValuesQuery": "",
        "tags": [],
        "tagsQuery": "",
        "type": "query",
        "useTags": false
      },
      {
        "allValue": null,
        "current": {
          "tags": [],
          "text": "",
          "value": ""
        },
        "datasource": "$Source",
        "definition": "label_values(env)",
        "hide": 0,
        "includeAll": true,
        "label": "env",
        "multi": false,
        "name": "env",
        "options": [],
        "query": "label_values(env)",
        "refresh": 1,
        "regex": "",
        "skipUrlSync": false,
        "sort": 1,
        "tagValuesQuery": "",
        "tags": [],
        "tagsQuery": "",
        "type": "query",
        "useTags": false
      },
      {
        "current": {
          "tags": [],
          "text": "",
          "value": ""
        },
        "hide": 0,
        "includeAll": false,
        "label": null,
        "multi": false,
        "name": "Source",
        "options": [],
        "query": "prometheus",
        "refresh": 1,
        "regex": "",
        "skipUrlSync": false,
        "type": "datasource"
      }
    ]
  },

我需要修改的部分是包含以下内容的块 "query": "label_values(env)", 而我只需要改变 "regex": "",

我已经试过了,问题是它只打印".list[]"元素,而不是整个文件。

jq '.templating.list[] | select(.name == "env") |= . + {regex:"*"}' "dashboard.json" > test.json 

问题是它只打印".list[]"元素,而不是整个文件。我需要能够为多个其他文件做出这样的改变,这些文件将有相同的块,但不一定在相同的地方,所以我不能只按索引号选择。

以上脚本的输出。

{
  "allValue": ".*",
  "current": {},
  "datasource": "$Source",
  "hide": 0,
  "includeAll": false,
  "label": null,
  "multi": true,
  "name": "node",
  "options": [],
  "query": "label_values(node_boot_time{env=~\"$env\"}, instance)",
  "refresh": 1,
  "regex": "",
  "sort": 0,
  "tagValuesQuery": "",
  "tags": [],
  "tagsQuery": "",
  "type": "query",
  "useTags": false
}
{
  "allValue": null,
  "current": {
    "tags": [],
    "text": "",
    "value": ""
  },
  "datasource": "$Source",
  "definition": "label_values(env)",
  "hide": 0,
  "includeAll": true,
  "label": "env",
  "multi": false,
  "name": "env",
  "options": [],
  "query": "label_values(env)",
  "refresh": 1,
  "regex": "*",
  "skipUrlSync": false,
  "sort": 1,
  "tagValuesQuery": "",
  "tags": [],
  "tagsQuery": "",
  "type": "query",
  "useTags": false
}
{
  "current": {
    "tags": [],
    "text": "",
    "value": ""
  },
  "hide": 0,
  "includeAll": false,
  "label": null,
  "multi": false,
  "name": "Source",
  "options": [],
  "query": "prometheus",
  "refresh": 1,
  "regex": "",
  "skipUrlSync": false,
  "type": "datasource"
}
json jq
2个回答
2
投票

定位 |= 早期保留原有结构。

.templating.list[] |= (select(.name == "env") .regex = "*")

在线演示


2
投票

你的预期输出与你的问题描述不太匹配。如果你的要求是在 templating 列表查找查询包含 "label_values(env)" 并更新 regex"" 您需要在下面。要将其改为 *,使用 regex = "*"

.templating.list[] |= ( select(.query == "label_values(env)").regex = "")

关键是要使用正确的路径,并使用select操作符来获取对象更新,使用 |= 经营者

jq-play片段

© www.soinside.com 2019 - 2024. All rights reserved.