jq注入文字换行符和转义符,而不是实际的换行符

时间:2019-06-26 15:31:51

标签: json jq

我有以下JSON:

{
  "overview_ui": {
    "display_name": "my display name",
    "long_description": "my long description",
    "description": "my description"
  }
}

我这样抓住它:

overview_ui=$(jq -r ".overview_ui" service.json)

然后我想用它来替换另一个JSON文件中的内容:

jq -r --arg updated_overview_ui_strings "${overview_ui}" '.overview_ui.${language} |= $updated_overview_ui_strings' someOtherFile.json

此方法有效,但是它还会引入可见的换行符\n和转义\字符,而不是将换行符实际保留为换行符。为什么这样做?

"en": "{\n  \"display_name\": \"my display name\",\n  \"long_description\": \"my long description\",\n  \"description\": \"my description\"\n}",

1 个答案:

答案 0 :(得分:2)

您已将overview_ui变量作为字符串读取(使用--arg),因此在分配变量时,已分配了该字符串(以及格式)。您要么必须将其解析为一个对象(使用fromjson),要么仅使用--argjson

jq -r --argjson updated_overview_ui_strings "${overview_ui}" ...

尽管您实际上并不需要在多个单独的调用中执行此操作,但您可以将文件作为参数读取,因此可以在一个调用中进行操作。

$ jq --argfile service service.json --arg language en '
.overview_ui[$language] = $service.overview_ui
' someOtherFile.json