Bash: как построить JSON из многострочных строк

Ваша конфигурация dpkgв вашей системе Ubuntu, а именно директива path-exclude=/usr/share/man/*в /etc/dpkg/dpkg.cfg.d/excludes, предписывает с dpkgпо не устанавливать справочные страницы.

Если вы хотите установить справочные страницы, удалите соответствующую строку и установите пакет заново.

-1
05.05.2020, 17:29
4 ответа

Вы можете использовать документ ЗДЕСЬ, как показано ниже:

echo "$(cat <<EOM
{ "result" : "$awkresult" }
EOM
)" > result.json

Обратите внимание на двойные -кавычки «в операторе echo, он сохраняет все символы новой строки, и вам не нужно экранировать кавычки \» внутри.

1
28.04.2021, 23:16

Ваша идея была правильной, но не используйте двойные -кавычки для кодирования строки JSON. Используйте одинарные кавычки вокруг {..}, используйте специальную последовательность кавычек, чтобы расширить awkresultвнутри одинарных кавычек

awkresult='foo\nbar\nzoo\n'

теперь используйте переменную как

echo '{ "result": "'"$awkresult"'" }' > result.json

Также помните, что спецификация JSON «не» позволяет встраивать буквальные управляющие символы новой строки. Вы можете проверить, действителен ли фрагмент JSON

echo '{ "result": "'"$awkresult"'" }' | jq.
{
  "result": "foo\nboo\nbar\n"
}
1
28.04.2021, 23:16

Код, который вы уже опубликовали, сохранит новые строки в$awkresult:

$ awkresult='foo
bar'
$ echo "{ \"result\": \"$awkresult\" }"
{ "result": "foo
bar" }

но есть более простой, надежный и переносимый способ сделать то же самое:

awkresult="$(awk '{...}')"
printf '{ "result": "%s" }\n' "$awkresult" > result.jso

Или вы имели в виду, что вам нужно заменить новые строки \nстроками, подобными этой

$ printf '{ "result": "%q" }\n' "$awkresult"
{ "result": "$'foo\nbar'" }

или что-то другое?

1
28.04.2021, 23:16

Обратите внимание, что новые строки в значениях должны быть закодированы как \nв JSON. Парсер JSON декодирует их как настоящие новые строки. Вставка литерала новой строки в значение в файле JSON приведет к повреждению документа JSON.

Использованиеjo(инструмента для генерации вывода JSON в оболочке с правильной кодировкой и т. д.):

awkresult='some string
with newlines
the end'

jo result="$awkresult"

Это приведет к выводу

{"result":"some string\nwith newlines\nthe end"}

Для красивой печати:

jo -p result="$awkresult"

, что приводит к

{
   "result": "some string\nwith newlines\nthe end"
}

Перенаправить вывод joв файл для сохранения вывода, например.

jo result="$awkresult" >result.json
3
28.04.2021, 23:16

Теги

Похожие вопросы