Json 用文件内容替换关键字

Json 用文件内容替换关键字,json,bash,shell,sed,jq,Json,Bash,Shell,Sed,Jq,我有一个名为template.json的模板化json文件,如下所示: { "subject": "Some subject line", "content": $CONTENT, } { "status": "ACTIVE", "id": 217, "type": "TEXT", "name": "string", "subject": "string", "url": "contenttemplates/217", "content": { "text": "hello $

我有一个名为template.json的模板化json文件,如下所示:

{
  "subject": "Some subject line",
  "content": $CONTENT,
}
{
"status": "ACTIVE",
"id": 217,
"type": "TEXT",
"name": "string",
"subject": "string",
"url": "contenttemplates/217",
"content": {
    "text": "hello ${user_name}",
    "variables": [{
        "key": "${user_name}",
        "value": null
    }]
},
"content_footer": null,
"audit": {
    "creator": "1000",
    "timestamp": 1548613800000,
    "product": "2",
    "channel": "10",
    "party": null,
    "event": {
        "type": null,
        "type_id": "0",
        "txn_id": "0"
    },
    "client_key": "pk6781gsfr5"
}
我有另一个名为sample.json的文件,json内容如下:

{
  "subject": "Some subject line",
  "content": $CONTENT,
}
{
"status": "ACTIVE",
"id": 217,
"type": "TEXT",
"name": "string",
"subject": "string",
"url": "contenttemplates/217",
"content": {
    "text": "hello ${user_name}",
    "variables": [{
        "key": "${user_name}",
        "value": null
    }]
},
"content_footer": null,
"audit": {
    "creator": "1000",
    "timestamp": 1548613800000,
    "product": "2",
    "channel": "10",
    "party": null,
    "event": {
        "type": null,
        "type_id": "0",
        "txn_id": "0"
    },
    "client_key": "pk6781gsfr5"
}
}

我想用CONTENT.json文件中标记“CONTENT”下的内容替换template.json中的
$CONTENT
。我已尝试使用以下sed命令:

sed -i 's/$CONTENT/'$(jq -c '.content' sample.json)'/' template.json
我得到以下错误:

sed: -e expression #1, char 15: unterminated `s' command

有人能帮我获取正确的sed命令(或任何其他替代命令)吗?

来自
jq
的输出包含空格,您需要引用它们以防止shell标记它们

sed -i 's/$CONTENT/'"$(jq -c '.content' sample.json)/" template.json
使用GNU时,请进一步查看:

sed'/$CONTENT/{s/*/jq-c.CONTENT“sample.json/e}'


用命令替换整行,然后执行命令并用命令的输出替换sed的模式空间。

jq食谱中有一节介绍如何使用带模板的jq:

在本例中,第一种技术(“使用jq变量作为模板变量”)与已定义的模板文件相匹配(除了悬空逗号),因此您可以编写以下示例:

jq -n --arg CONTENT "$(jq -c .content sample.json)" '
  {"subject": "Some subject line", "content": $CONTENT}'
或使用以下格式:

jq -n --arg CONTENT "$(jq -c .content sample.json)" -f template.jq

(对于包含json或json流的文件,我只使用.json后缀。)

如果内容包含
\1
&
,该怎么办p当你遇到更多问题时。当然,我并不特别推荐使用
sed
。我不想太迂腐,但也许你可以这么说。在我看来,使用json模板的OP不是一个有效的json,这是一个非常糟糕的想法,也是这个问题的根源。如果模板将使用
“content”:“$content”
(例如),问题就不会那么严重了,因为
jq
可以用来呈现模板将模板视为jq文件而不是json,这并不是一个坏把戏。但我并不真的建议这样做,因为这意味着从那一刻起,你就注定要
jq
。对我来说,使模板有效的json听起来是一种更好的、可移植的方法。@hek2mgl-这就是我提到jq Cookbook一节的原因,它记录了另外两种技术。