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

标签 bash jq

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

对于这个例子,我的 json 文件是 params.json

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

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

[ 
 {
    "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"

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

最佳答案

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

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

……或者……

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

关于bash - 当键是已知字符串时,使用 jq 删除键/值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55857004/

相关文章:

arrays - jq 输出空字符串时 bash readarray -t 数组赋值的问题

bash - Shell 逐行读取文件,但在每一行之后都显示未找到。我错过了什么?

bash - 如何最好地集成 Emacs 和 Cygwin?

JQ:将 UNIX 时间戳转换为日期时间

json - 使用 jq 有条件地将元素添加到 json 数组

bash - 如何在 bash 命令中断开 jq 中的长字符串?

linux - Bash:循环从 CSV 中一次读取 N 行

php - PHP cli 中没有颜色

linux - 与 BC 合作

linux - 将文件中的多个参数传递给 Shell 中的 while 循环