Как выводить инвертированные совпадения с помощью JSON-процессора командной строки jq?

#json #jq #negation

#json #jq #отрицание

Вопрос:

Возможно ли выводить инвертированные совпадения с помощью JSON-процессора командной строки jq? Инструмент grep поддерживает эту опцию -v, --invert-match: select non-matching lines .

В качестве примера я ищу команду, подобную следующей. Однако without(...) не существует:

 $  echo '{"a": 0, "b": 1, "c": 2}' | jq '. | without(c)' 
{
  "a": 0,
  "b": 1
}

 
  • Нет такой опции программы, как grep -v for jq .
  • Мне не удалось найти базовый фильтр для этого.

Поддерживаются ли инвертированные совпадения?

Ответ №1:

jq, как правило, довольно минималистичен, поэтому, когда вы сомневаетесь в поиске чего-то противоположного, not всегда можно прийти на помощь, например

 with_entries(select(.key == "c"|not))
 

Вероятно, здесь не знакомо то, что not в jq есть обычный фильтр 0-арности.

Конечно != , также поддерживается:

 with_entries(select(.key != "c"))
 

Поскольку вы упомянули grep , возможно, стоит отметить, что jq «эквивалент» grep -v "REGEX" будет test("REGEX")|not .

Кстати, это начальное . | значение в вашей первой попытке не потребуется.

Ответ №2:

При написании этого вопроса я нашел встроенную del(path_expression) функцию, которая решает проблему:

Встроенная функция del удаляет ключ и соответствующее ему значение из объекта.

 $ echo '{"a": 0, "b": 1, "c": 2}' | jq 'del(.c)'
{
  "a": 0,
  "b": 1
}