【问题标题】:Loop over JSON and create files with key as filename and value as file content循环 JSON 并创建文件,其中键作为文件名,值作为文件内容
【发布时间】:2020-10-05 06:57:23
【问题描述】:

我有一个类似 JSON 的示例

  "request_id": "016-ae81e5737add",
  "renewable": false,
  "data": {
      "client_decrypted.key": "-----BEGIN KEY-----sdjijhgisdTRjkRD05\n-----END KEY-----",
      "passphrase": "password"
    }

在我的 bash 脚本中,我正在阅读 JSON,特别是 data 键的内容。我想创建文件名为key的文件(例如:client_decrypted.keypassphrase之类的文件),文件内容为对应键的value

我能够使用 jq 读取键值对

for pair in $( jq -r ".data | to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]"); do
    echo $${pair} # OUTPUT=passphrase=password
done

我想我可以使用 IFS 在= 上拆分每一对。有更好的方法吗?

【问题讨论】:

  • 很抱歉给您带来了困惑。我已经编辑了我的问题。已添加完整的 JSON sn-p。

标签: bash jq


【解决方案1】:

一种安全的方法是发出带有 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 字段存储在各自的变量中。

请注意,&lt;(..) 是一种 bash/ksh93/zsh 进程替换技术,它不符合 POSIX,并且可能无法在纯 bourne shell 中工作。

【讨论】:

  • “安全”?这里的安全可能意味着检查或消毒钥匙。
  • 我控制 JSON 值的来源。所以我认为我不需要检查空值,这就是你所说的清理密钥的意思吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2018-08-04
相关资源
最近更新 更多