и альтернативное решение, используя jtc
bash $ <input.json jtc -w'<items>l[-1]' | jtc -w'[id]:<bbb>[-1]' -pp
{
"items": [
{
"id": "bbb",
"name": "that"
}
]
}
bash $
первый jtc
оператор печатает items
полностью, второй удаляет все, кроме объекта сbbb
* ОБНОВЛЕНИЕ * последняя версия jtc
теперь позволяет использовать пространства имен.Чтобы облегчить вопрос, используйте его так:
bash $ <input.json jtc -w'[update][toRemove][:]<2rm>v [^0][id]:<2rm>s[-1]' -p | jtc -w'[source]'
{
"items": [
{
"id": "bbb",
"name": "that"
}
]
}
bash $
Пояснения:
1.[update][toRemove][:]<2rm>v
- эта часть пути обхода будет проходить по каждому элементу в toRemove
при сохранении каждого повторного значения в пространстве имен 2rm
2.[^0][id]:<2rm>s[-1]
- сбросит путь обхода к корню ([^0]
) и найдет каждую запись JSON, соответствующую той, которая хранится в 2rm
, [-1]
выберет родителя найденной записи (которая выбирает запись элемента * 1031)*
3. -p
удалит найденные (пройденные) элементы, а затем jtc
выберет source