«Проблема» на самом деле заключается в том, что вы используете и не выполняете сценарий. Когда вы отправляете файл, его содержимое будет выполняться в текущей оболочке, вместо того, чтобы размножать подоболочку. Таким образом, все, включая выход, повлияет на текущую оболочку.
Вместо использования exit
вы захотите использовать return
.
OP вернулся через несколько часов - я нашел кое-что, что, кажется, работает, все еще очень заинтересованный в любых комментариях / других способах взломать проблему / улучшения.
.content.data
| .hits[].doc.notes |= map (
if ( .types | any(startswith("x") or startswith("y")))
then .
else empty
end
)
Это всего лишь вариант решения, предложенного ОП. Он иллюстрирует, как сложное использование del
может быть выражено более простым и надежным способом путем создания подходящей вспомогательной функции.
Соответствующая вспомогательная функция в данном случае реализует требование извлечения:
# Input: an object some keys of which are to be removed
def prune:
to_entries
| map( select( any(.value.types[]; test("^(x|y)")) ) )
| from_entries ;
Теперь задача может быть выполнена с использованием одной строки:
.content.data | .hits |= map( .doc.notes |= prune )
При использовании вышеуказанной jq-программы в program.jq подходящий вызов jq будет выглядеть следующим образом:
jq -f program.jq input.json