Я пытаюсь написать сценарий оболочки, который может читать строку json, декодировать его в массив и проецировать через массив и использовать ключ/значение для замены строк в другом файле.Замените теги в текстовом файле с помощью пар ключ-значение из файла JSON
Если бы это был PHP, я бы написал что-то вроде этого.
$array = json_decode($jsonString, true);
foreach($array as $key => $value)
{
str_replace($key, $value, $rawString);
}
Мне нужно, чтобы оно было преобразовано в сценарий Bash. Вот пример строки JSON.
{
"login": "lambda",
"id": 37398,
"avatar_url": "https://avatars.githubusercontent.com/u/37398?v=3",
"gravatar_id": "",
"url": "https://api.github.com/users/lambda",
"html_url": "https://github.com/lambda",
"followers_url": "https://api.github.com/users/lambda/followers",
"following_url": "https://api.github.com/users/lambda/following{/other_user}",
"gists_url": "https://api.github.com/users/lambda/gists{/gist_id}",
"starred_url": "https://api.github.com/users/lambda/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/lambda/subscriptions",
"organizations_url": "https://api.github.com/users/lambda/orgs",
"repos_url": "https://api.github.com/users/lambda/repos",
"events_url": "https://api.github.com/users/lambda/events{/privacy}",
"received_events_url": "https://api.github.com/users/lambda/received_events",
"type": "User",
"site_admin": false,
"name": "Brian Campbell",
"company": null,
"blog": null,
"location": null,
"email": null,
"hireable": null,
"bio": null,
"public_repos": 27,
"public_gists": 23,
"followers": 8,
"following": 2,
"created_at": "2008-11-30T21:03:27Z",
"updated_at": "2016-12-21T23:53:11Z"
}
Я этот файл,
Lamba login name is %login%, and avatar url is %avatar_url%
Я использую JQ
jq -c '.[]' /tmp/json | while read i; do
echo $i
done
Это выводит только значение часть. Как мне прокрутить ключ, а также получить значение?
Кроме того, я обнаружил, что ключи строки JSon могут быть возвращены с помощью
jq 'keys' /tmp/params
Однако, я все еще пытаюсь понять, как цикл через ключ и возвращает данные.
А хорошо, это делает мое решение выглядеть довольно глупым ... –
@BenjaminW. Не каждый имеет доступ к jq с поддержкой регулярных выражений, поэтому неплохо иметь какую-то альтернативу, даже если (как вы это заметили) у нее есть свои оговорки. Возможно, вам захочется документировать то, что, по моему мнению, является довольно надежным обходным путем - с использованием контрольного символа (например, control-A) в качестве разделителя sed. Он устойчив, по крайней мере, до такой степени, что JSON не позволяет использовать сырые контрольные символы в строках JSON. – peak
Я думал о том, чтобы добавить это явно, но об этом спрашивали и отвечали раньше - я мог бы попробовать найти Q & A и ссылку на него. Вопрос о вашем решении: возможно ли иметь содержимое словаря и шаблона во внешних файлах? Очевидно, вы можете использовать шаблон 'jq -n 'def:« ... »; уменьшить ... '