Ajinkya Bambal
Ajinkya Bambal

Reputation: 101

Replace a keyword with the content of the file

I have a templatized json file called template.json as below:

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

I have another file called sample.json with the json content as below:

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

}

I want to replace $CONTENT from template.json with the content under the tag "content" from the content.json file . I have tried with below sed commands:

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

I am getting below error:

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

Can someone please help me to get the right sed command (or any other alternative)?

Upvotes: 4

Views: 810

Answers (3)

peak
peak

Reputation: 116690

The jq Cookbook has a section on using jq with templates: https://github.com/stedolan/jq/wiki/Cookbook#using-jq-as-a-template-engine

In the present case, the first technique ("Using jq variables as template variables") matches the already-defined template file (except for the dangling comma), so you could for example write:

jq -n --arg CONTENT "$(jq -c .content sample.json)" '
  {"subject": "Some subject line", "content": $CONTENT}'

or use the format:

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

(I'd only use the .json suffix for files that hold JSON or JSON streams.)

Upvotes: 4

stevesliva
stevesliva

Reputation: 5655

With GNU sed:

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

Replace the entire line with your command and e (GNU only) to execute the command and replace sed's pattern space with the output of the command.

Upvotes: 0

tripleee
tripleee

Reputation: 189327

The output from jq contains spaces, you need to quote them to prevent the shell from tokenizing them.

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

See further When to wrap quotes around a shell variable?

Upvotes: 0

Related Questions