#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
forjq
. - Мне не удалось найти базовый фильтр для этого.
Поддерживаются ли инвертированные совпадения?
Ответ №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
}