【问题标题】:Replace a keyword with the content of the file将关键字替换为文件的内容
【发布时间】:2019-06-21 12:12:27
【问题描述】:

我有一个名为 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 命令(或任何其他替代命令)吗?

【问题讨论】:

    标签: json bash shell sed jq


    【解决方案1】:

    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 后缀。)

    【讨论】:

    • 将模板视为 jq 文件而不是 json 并不是那么糟糕的技巧。但我真的不建议这样做,因为这意味着您从那一刻起就必须使用jq。使模板有效的 json 听起来对我来说是一种更好、更便携的方法。
    • @hek2mgl - 这就是我提到 jq Cookbook 部分的原因,该部分记录了其他两种技术。
    【解决方案2】:

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

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

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

    【讨论】:

    • 如果内容包含\1& 怎么办? :P
    • 那你有更多的问题。当然,我并不特别推荐sed
    • 我不想学究气,但也许你可以这么说。 Imo 使用无效 json 的 json 模板的 OP 是一个非常糟糕的主意,也是这个问题的根源。如果模板使用"content": "$content"(例如),这将不是问题,因为jq 可用于呈现模板
    【解决方案3】:

    使用 GNU sed:

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

    将整行替换为您的命令,e (GNU only) 以执行命令并将 sed 的模式空间替换为命令的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-09
      • 2019-02-24
      • 2022-01-05
      • 1970-01-01
      • 2023-04-04
      • 2011-05-06
      • 1970-01-01
      • 2011-08-22
      相关资源
      最近更新 更多