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

Ale*_*lex 2 bash jq

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

在本例中,我的json文件是 params.json

[ 
 {
    "ParameterKey": "RTSMMinSize",
    "ParameterValue": "1"
  },
  {
    "ParameterKey": "RTSMReplicateDB",
    "ParameterValue": "false"
  },
  {
    "ParameterKey": "RTSMSnapshotID",
    "ParameterValue": "snapID"
  },
  {
    "ParameterKey": "RTSMEMAIL",
    "ParameterValue": ""
  }
]
Run Code Online (Sandbox Code Playgroud)

我想在RTSMSnapshotID我的bash脚本中完全删除键值对。该文件应如下所示:

[ 
 {
    "ParameterKey": "RTSMMinSize",
    "ParameterValue": "1"
  },
  {
    "ParameterKey": "RTSMReplicateDB",
    "ParameterValue": "false"
  },
  {
    "ParameterKey": "RTSMEMAIL",
    "ParameterValue": ""
  }
]
Run Code Online (Sandbox Code Playgroud)

我以为这很简单

jq 'del(.RTSMSnapshotID)' params.json  
Run Code Online (Sandbox Code Playgroud)

但我越来越

jq: error (at <filename>): Cannot index array with string "RTSMSnapshotID"
Run Code Online (Sandbox Code Playgroud)

显然,我不明白删除的工作原理。有什么帮助吗?

Cha*_*ffy 6

del(.foo)期望有一个名为的键的顶级词典foo。这里不是这种情况。取而代之的是,您有一个ParameterKey包含一系列值的顶级列表,并且只想删除其中的一对值。

jq '[ .[] | select(.ParameterKey != "RTSMSnapshotID") ]'
Run Code Online (Sandbox Code Playgroud)

...要么...

jq 'map(select(.ParameterKey != "RTSMSnapshotID"))'
Run Code Online (Sandbox Code Playgroud)