Json 用文件内容替换关键字
我有一个名为template.json的模板化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 $
{
"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一节的原因,它记录了另外两种技术。