当键是已知字符串时,用jq删除键/值对

时间:2019-04-25 20:16:45

标签: bash jq

我正在尝试从json文件中删除一个特定的键/值对。

在此示例中,我的json文件为params.json

[ 
 {
    "ParameterKey": "RTSMMinSize",
    "ParameterValue": "1"
  },
  {
    "ParameterKey": "RTSMReplicateDB",
    "ParameterValue": "false"
  },
  {
    "ParameterKey": "RTSMSnapshotID",
    "ParameterValue": "snapID"
  },
  {
    "ParameterKey": "RTSMEMAIL",
    "ParameterValue": ""
  }
]

我想完全删除RTSMSnapshotID键值对作为bash脚本的一部分。该文件应如下所示:

[ 
 {
    "ParameterKey": "RTSMMinSize",
    "ParameterValue": "1"
  },
  {
    "ParameterKey": "RTSMReplicateDB",
    "ParameterValue": "false"
  },
  {
    "ParameterKey": "RTSMEMAIL",
    "ParameterValue": ""
  }
]

我认为这就像

一样简单
jq 'del(.RTSMSnapshotID)' params.json  

但是我得到了

jq: error (at <filename>): Cannot index array with string "RTSMSnapshotID"

很明显,我不明白删除是如何工作的。有帮助吗?

2 个答案:

答案 0 :(得分:5)

del(.foo)期望有一个顶级字典,其关键字为foo。这里不是这种情况。相反,您有一个顶级列表,其中ParameterKey具有一系列值,并且只希望删除其中一个对。

jq '[ .[] | select(.ParameterKey != "RTSMSnapshotID") ]'

...或...

jq 'map(select(.ParameterKey != "RTSMSnapshotID"))'

答案 1 :(得分:0)

让我为您提供一个替代解决方案-一种用于JSON的步行路径Unix工具: jtc 公开:我是创作者。

您的示例似乎只是一个较大JSON的部分代码段,因为已对其进行枚举,但您的条目周围缺少[]。如果是这样,和/或括号被恢复,则用jtc删除所需的值就像:

bash $ <params.json jtc -w'<RTSMSnapshotID>[-1]' -p
[
   {
      "ParameterKey": "RTSMMinSize",
      "ParameterValue": "1"
   },
   {
      "ParameterKey": "RTSMReplicateDB",
      "ParameterValue": "false"
   },
   {
      "ParameterKey": "RTSMEMAIL",
      "ParameterValue": ""
   }
]
bash $ 

如果您想将更改直接应用到源文件(params.json)中,然后抛出-f选项,并将文件名传递给jtc:。

bash $ jtc -w'<RTSMSnapshotID>[-1]' -p -f params.json 
bash $ jtc params.json
[
   {
      "ParameterKey": "RTSMMinSize",
      "ParameterValue": "1"
   },
   {
      "ParameterKey": "RTSMReplicateDB",
      "ParameterValue": "false"
   },
   {
      "ParameterKey": "RTSMEMAIL",
      "ParameterValue": ""
   }
]
bash $