使用jq,如何有条件地修改其输入的一部分并输出经过这些更改的原始结构?

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

我有一个包含以下内容的

input.json
文件:

{
  "noise1": 5,
  "signal": [
    {
      "name": "child-signal-1",
      "nested": {
        "prop": "child-prop-3"
      }
    },
    {
      "name": "child-noise-2",
      "nested": {
        "prop": "child-prop-3"
      }
    },
    {
      "name": "child-signal-3",
      "nested": {
        "prop": "child-prop-3"
      }
    }
  ],
  "noise2": [
    {
      "name": "child-signal-1",
      "nested": {
        "prop": "child-prop-3"
      }
    },
    {
      "name": "child-noise-2",
      "nested": {
        "prop": "child-prop-3"
      }
    },
    {
      "name": "child-signal-3",
      "nested": {
        "prop": "child-prop-3"
      }
    }
  ]
}

使用

jq
,我想读取该文件并输出:

{
  "noise1": 5,
  "signal": [
    {
      "name": "child-signal-1",
      "nested": {
        "prop": "CHANGED-1"
      }
    },
    {
      "name": "child-noise-2",
      "nested": {
        "prop": "child-prop-3"
      }
    },
    {
      "name": "child-signal-3",
      "nested": {
        "prop": "CHANGED-3"
      }
    }
  ],
  "noise2": [
    {
      "name": "child-signal-1",
      "nested": {
        "prop": "child-prop-3"
      }
    },
    {
      "name": "child-noise-2",
      "nested": {
        "prop": "child-prop-3"
      }
    },
    {
      "name": "child-signal-3",
      "nested": {
        "prop": "child-prop-3"
      }
    }
  ]
}

我偶然发现了答案,但我不完全理解它为什么有效,特别是与我之前尝试过的所有内容相比(参见下面的#2):

.signal[] |= (select(.name | contains("signal")) .nested.prop = (.name | gsub(".*-(?<namedigit>[0-9])"; "CHANGED-\(.namedigit)")))
  1. 有没有更简单的方法来写上面的内容?

  2. 为什么我所有其他尝试都打印多个 json 对象:

    .signal[] | select(.name | contains("signal")) as $matches | .
    (.signal[] | select(.name | contains("signal"))) as $matches | .
    .signal[] | select(.name | contains("signal")) | .nested.prop = (.name | gsub(".*-(?<namedigit>[0-9])"; "CHANGED-\(.namedigit)"))
    

    需要明确的是:我并不是要求对每个内容进行详细解释,我只是假设它们共享一个导致多个 json 输出的共同主题,并且我想了解那是什么。

json bash command-line jq
© www.soinside.com 2019 - 2024. All rights reserved.