JQ: как я могу удалить ключи на основе регулярных выражений? - PullRequest
0 голосов
/ 05 сентября 2018

Я хотел бы удалить все ключи, которые начинаются с «скрыть». Важно отметить, что ключи могут быть вложенными на многих уровнях. Я хотел бы увидеть ответ, используя регулярное выражение, хотя я понимаю, что в моем примере достаточно простого contains. (Кстати, я тоже не знаю, как это сделать с contains.)

Ввод JSON 1:

{
  "a": 1,
  "b": 2,
  "hideA": 3,
  "c": {
    "d": 4,
    "hide4": 5
  }
}

Желаемый вывод JSON:

{
  "a": 1,
  "b": 2,
  "c": {
    "d": 4
  }
}

Ввод JSON 2:

{
  "a": 1,
  "b": 2,
  "hideA": 3,
  "c": {
    "d": 4,
    "hide4": 5
  },
  "e": null,
  "f": "hiya",
  "g": false,
  "h": [{
    "i": 343.232,
    "hide9": "private",
    "so_smart": true
  }]
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Простым подходом к проблеме является использование walk в сочетании с with_entries, например,

walk(if type == "object" 
     then with_entries(select(.key | test("^hide") | not))
     else . end)

Если ваш jq не имеет walk/1, просто включите его def (доступно, например, из https://raw.githubusercontent.com/stedolan/jq/master/src/builtin.jq) до его вызова.

0 голосов
/ 05 сентября 2018

Поскольку вы просто проверяете начало ключей, вы можете использовать startswith/1 вместо этого, в противном случае вы можете использовать test/1 или test/2. Затем вы можете передать эти пути, которые нужно удалить, на delpaths/1.

Возможно, вы захотите предварительно отфильтровать ключ по строкам (или преобразовать в строки), чтобы учесть массивы в вашем дереве.

delpaths([paths | select(.[-1] | strings | startswith("hide"))])
delpaths([paths | select(.[-1] | strings | test("^hide"; "i"))])
...