Bash: Как экранировать строку для использования в JSON? - PullRequest
0 голосов
/ 02 мая 2020
Сценарий

My Bash содержит множество переменных назначений, которые помещаются в файл JSON:

var='Hello
    "world". 
    This is \anything \or \nothing
'
echo "{ \"var\"= \"$var\" }" > output.json

При проверке файла output.json jq говорит:

$ cat output.json | jq .
parse error: Invalid numeric literal at line 1, column 9

Как я могу сделать из него действительный JSON файл? Любые \ и " должны быть сохранены.

Правильная строка JSON будет иметь вид

{ "var": "Hello
    \"world\". 
    This is \\anything \\or \\nothing
  " }

Я не могу изменить назначения переменных, кроме создания JSON.

Ответы [ 2 ]

2 голосов
/ 02 мая 2020

Передайте $var в качестве необработанного строкового аргумента, и JQ автоматически преобразует его в действительную JSON строку.

$ jq -n --arg var "$var" '{$var}'
{
  "var": "Hello\n    \"world\". \n    This is \\anything \\or \\nothing\n"
}
0 голосов
/ 03 мая 2020

"JSON строки не могут содержать перевод строки ", как уже упоминалось в oguz ismail, поэтому лучше использовать специальные инструменты, такие как xidel (или jq) преобразовать перевод строки в правильную escape-последовательность и в действительный JSON.

Stdin:

$ var='Hello
    "world". 
    This is \anything \or \nothing
'

$ xidel - -se '{"var":$raw}' <<< "$var"
{
  "var": "Hello\n    \"world\". \n    This is \\anything \\or \\nothing\n"
}

Переменная среды:

$ export var='Hello
    "world".
    This is \anything \or \nothing
'

$ xidel -se '{"var":environment-variable("var")}'
{
  "var": "Hello\n    \"world\". \n    This is \\anything \\or \\nothing\n"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...