Как вы назначаете объекты json в jq?

#shell #jq #double-quotes

#оболочка #jq #двойные кавычки

Вопрос:

Я пытался jq --argjson value '{"foo": "bar", "bar": "foo"}' ".x = $value" <<< "$json"

Значение $ json

 {
   "x":{
      "foo": "hello"
   },
   "y":{
      "foo": "world"
   }
}
  

Все, что я получаю, это jq: 1 compile error

Я ожидаю:

 {
   "x":{
      "foo": "bar",
      "bar": "foo"
   },
   "y":{
      "foo": "world"
   }
}
  

Я попытался добавить кавычки вокруг $value, но он жалуется на проблемы с цитированием bash, и я полагаю, что он пытается сохранить весь объект json в виде строки

Комментарии:

1. проверьте свои кавычки

2. @hek2mgl Извиняюсь, кавычки указаны правильно в моем терминале, но я неправильно ввел их в поле stackoverflow

3. Если значение действительно жестко запрограммировано, как показано, это было бы проще без использования --argjson : jq '.x = { foo: "bar", bar: "foo"}}' <<< "$json" .

4. @chepner Не жестко запрограммирован, я фактически извлекаю объект json из файла json, манипулирую им, а затем копирую его во второй файл json. Здесь это жестко запрограммировано, потому что я знаю, что копия из части работает (проверял ее с помощью echos и прочего). Это средний этап обработки

Ответ №1:

Доллар должен быть экранирован при использовании внутри строки в двойных кавычках в оболочке. В противном случае оболочка интерпретировала бы это и расширила оператор до:

 jq --argjson value '{"foo": "bar", "bar": "foo"}' ".x = " <<< "$json"
                     empty since not set in the shell  ^^^
  

Я предлагаю заключить команду jq в одинарные кавычки:

 jq --argjson value '{"foo": "bar", "bar": "foo"}' '.x = $value' <<< "$json"
  

Комментарии:

1. похоже, ваша переменная $ json искажена

2. Вы правы (как в искаженных, так и в кавычках). Я только что дважды проверил это. Спасибо. Я приму этот ответ, как только stackoverflow позволит мне

3. Рад, что это помогло!