用文件内容替换关键字

时间:2019-01-28 13:17:59

标签: json bash shell sed jq

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

{
  "subject": "Some subject line",
  "content": $CONTENT,
}

我还有一个名为 sample.json 的文件,其json内容如下:

{
"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"
}

}

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

sed -i 's/$CONTENT/'$(jq -c '.content' sample.json)'/' template.json

我遇到以下错误:

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

有人可以帮助我获得正确的sed命令(或任何其他替代方法)吗?

3 个答案:

答案 0 :(得分:3)

jq Cookbook有一节介绍如何将jq与模板一起使用:https://github.com/stedolan/jq/wiki/Cookbook#using-jq-as-a-template-engine

在当前情况下,第一种技术(“将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 :(得分:0)

jq的输出包含空格,您需要引用它们以防止shell对它们进行标记。

sed -i 's/$CONTENT/'"$(jq -c '.content' sample.json)/" template.json

进一步查看When to wrap quotes around a shell variable?

答案 2 :(得分:0)

使用GNU sed:

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

用命令和eGNU only)替换整行以执行命令,并用命令的输出替换sed的模式空间。