根据另一个键值在JSON中更改对象的值-Shell

时间:2020-04-16 13:54:43

标签: shell jq

在外壳中,我有以下对象

[
{
  "ParameterKey":"a",
  "ParameterValue":"1"
},
{
  "ParameterKey":"b",
  "ParameterValue":"2"
},
{
  "ParameterKey":"c",
  "ParameterValue":"3"
},
{
  "ParameterKey":"d",
  "ParameterValue":"4"
}
]

我需要找出如何以最佳方式(例如,不使用数组索引)访问ParameterKey'b'和'd'。 jq,这样得到的数组将是:

[
{
  "ParameterKey":"a",
  "ParameterValue":"1"
},
{
  "ParameterKey":"b",
  "ParameterValue":"5"
},
{
  "ParameterKey":"c",
  "ParameterValue":"3"
},
{
  "ParameterKey":"d",
  "ParameterValue":"6"
}
]

2 个答案:

答案 0 :(得分:1)

这将为ParameterName更改单个ParameterValue

jq '[.[] | select(.ParameterKey == "b") .ParameterValue |= "5"]'

[
  {
    "ParameterKey": "a",
    "ParameterValue": "1"
  },
  {
    "ParameterKey": "b",
    "ParameterValue": "5"
  },
  {
    "ParameterKey": "c",
    "ParameterValue": "3"
  },
  {
    "ParameterKey": "d",
    "ParameterValue": "4"
  }
]

Try it online!

如果您不想对键和值进行硬编码,则可以使用--arg

jq --arg key "b" --arg value "5" '[.[] | select(.ParameterKey == $key) .ParameterValue |= $value]' </tmp/data.json

[
  {
    "ParameterKey": "a",
    "ParameterValue": "1"
  },
  {
    "ParameterKey": "b",
    "ParameterValue": "5"
  },
  {
    "ParameterKey": "c",
    "ParameterValue": "3"
  },
  {
    "ParameterKey": "d",
    "ParameterValue": "4"
  }
]

希望这会有所帮助!

答案 1 :(得分:0)

不清楚您要问的是什么,但是以下jq过滤器解决了对该问题的一种解释:

map(if .ParameterKey == "b" then .ParameterValue = "5"
    elif .ParameterKey == "d" then .ParameterValue = "6"
    else . end)

这是使用单个JSON对象定义用于定义更新的键/值对的另一种方法:

map( {(.ParameterKey): .ParameterValue} )
| add + {b:"5", d:"6"}
| to_entries
| map( {ParameterKey: .key, ParameterValue: .value} )