Заменить ключевое слово содержимым файла - PullRequest
0 голосов
/ 28 января 2019

У меня есть шаблонный файл json с именем template.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"
}

}

Я хочу заменить $CONTENT из template.json содержимым под тегом «content» из файла content.json.Я пробовал с приведенными ниже командами sed:

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

Я получаю сообщение об ошибке ниже:

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

Может кто-нибудь помочь мне получить правильную команду sed (или любую другую альтернативу)?

Ответы [ 3 ]

0 голосов
/ 28 января 2019

С GNU sed:

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

Замените всю строку вашей командой и e ( GNU only ), чтобы выполнить команду и заменить sedПространство шаблона с выводом команды.

0 голосов
/ 28 января 2019

В 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.)

0 голосов
/ 28 января 2019

Вывод jq содержит пробелы, вам необходимо заключить их в кавычки, чтобы не допустить их токенизации оболочкой.

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

См. Далее Когда заключать в кавычки переменную оболочки?

...