如何在Bash脚本中遍历并处理独立JSON块
处理Bash中多个独立JSON对象的遍历问题
当你用jq处理后得到多个独立的JSON对象(每个以{}包裹),命令替换无法完整保留每个JSON块的结构,这里提供两种实用的解决方法:
方法一:单行输出+进程替换循环
先确保jq输出的每个JSON对象是单行格式(用-c参数压缩输出),再通过进程替换让while循环逐行读取完整的JSON块:
# 替换成你的实际jq命令,比如从文件提取多个对象 jq_command='jq -c ".items[]" data.json' while read -r json_block; do # 这里编写你的处理逻辑,比如提取字段 echo "处理的JSON块:" echo "$json_block" | jq '.title' # 其他操作示例:将JSON块传递给API请求 # curl -X POST -H "Content-Type: application/json" -d "$json_block" https://example.com/api done < <(eval "$jq_command")
原理说明
jq -c将每个JSON对象压缩为单行,避免换行导致的结构分割问题- 进程替换
< <(...)直接将jq的输出作为while循环的输入,逐行读取每个完整的JSON块,不会像命令替换那样把换行符合并为空格
方法二:处理多行格式化的JSON块
如果jq输出的是格式化后的多行JSON对象,可以用awk分割每个{}包裹的块,再循环读取:
awk ' /^{/ { in_block=1; buffer="" } in_block { buffer=buffer $0 "\n" } /^}/ { in_block=0; printf "%s\0", buffer } ' data.json | while read -d '' -r json_block; do # 处理每个完整的JSON块 echo "$json_block" | jq '.description' done
原理说明
- awk负责识别每个JSON块的起始(
{)和结束(}),收集完整的块后用空字符(\0)分隔输出 read -d ''以空字符作为分隔符读取,确保即使JSON块包含换行也能完整读取
内容的提问来源于stack exchange,提问作者unbox-us
相关产品推荐
相关产品推荐

