bash - 循环 JSON 并创建文件,其中键作为文件名,值作为文件内容
问题描述
我有一个示例 JSON
"request_id": "016-ae81e5737add",
"renewable": false,
"data": {
"client_decrypted.key": "-----BEGIN KEY-----sdjijhgisdTRjkRD05\n-----END KEY-----",
"passphrase": "password"
}
在我的 bash 脚本中,我正在阅读 JSON,特别是data
key 的内容。我想创建文件名为的文件key
(例如:文件,如client_decrypted.key
& passphrase
),文件的内容作为value
相应键的。
我能够使用 jq 来读取键值对
for pair in $( jq -r ".data | to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]"); do
echo $${pair} # OUTPUT=passphrase=password
done
我想我可以使用 IFS 在=
. 有没有更好的方法来做到这一点?
解决方案
一种安全的方法是发出带有 NULL 字节填充的 JSON 记录,然后在 shell 循环中将其读回,并在该字节上定界
while IFS= read -r -d '' key && IFS= read -r -d '' value; do
printf '%s\n' "$value" > "$key"
done < <(jq -j '.data | to_entries[] | (.key, "\u0000", .value, "\u0000")' json)
由于 NULL 字节不能是任何输入记录中“有效”字节的一部分,因此它被用作分隔符。jq
表达式_
(.key, "\u0000", .value, "\u0000")
在 key 和 value 字段之间附加 NULL 字节,使用 while 循环读取,一次读取两次以将 key name 和 value 字段存储在各自的变量中。
请注意,这<(..)
是一种 bash/ksh93/zsh 进程替换技术,它不符合 POSIX,并且可能无法在纯 bourne shell 中工作。
推荐阅读
- angular - matSort 动态垫表角度
- android-studio - 颤振酒吧获取
- vue.js - 如何在计算属性中使用道具?
- android - OpenCV 无法导入 Android Studio
- c# - 如何使用顶级 Program.cs 在 C# 9 中处理 {STAThread]
- search - vscode - 在状态栏中显示查找标志(匹配大小写/整个单词/正则表达式)
- python - 具有 maximum_concurrent_rpcs 限制的异步 gRCP 服务器引发异常
- r - 如何在 r 中使用 ts_plot 绘制具有 2 组推文数据的 2 个时间序列?
- javascript - 表示多个同名查询参数不返回数组
- python - Python 上的函数