Удалить пару ключ / значение с помощью jq, когда ключ является известной строкой - PullRequest
2 голосов
/ 25 апреля 2019

Я пытаюсь удалить одну конкретную пару ключ / значение из файла 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 ]

5 голосов
/ 25 апреля 2019

del(.foo) предполагает наличие словаря верхнего уровня с ключом с именем foo.Это не тот случай здесь;вместо этого у вас есть список верхнего уровня с ParameterKey, имеющим ряд значений, с одним из которых вы хотите удалить всю пару.

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

... или ...

jq 'map(select(.ParameterKey != "RTSMSnapshotID"))'
0 голосов
/ 25 апреля 2019

Позвольте мне предложить альтернативное решение по вашему запросу - Unix-инструмент Walk-Path для JSON: 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 $ 
...