如何在Bash中同时遍历文本文件与JSON文件
解决Bash脚本中文本行与独立JSON对象配对的问题
使用jq工具处理是最优方案,它专门用于JSON操作,能避免手动拼接JSON的语法错误,完美适配非数组格式的独立JSON对象。
前提
- 确保
file.txt的行数与file.json中的独立JSON对象数量完全匹配,每行文本对应一个JSON对象。 - 已安装
jq(Linux发行版可通过apt install jq或yum install jq安装)。
生成单个目标变量
如果只需要处理第一行文本和第一个JSON对象,生成示例格式的final变量:
final=$(jq -n --rawfile txt file.txt --slurpfile json file.json ' { example: ($txt | split("\n")[0]), tags: $json[0] }' | jq -c .) # 验证结果 echo "$final"
批量处理所有配对
如果要处理所有文本行和对应JSON对象,生成批量目标结构:
# 输出所有符合格式的单行JSON字符串 jq -n --rawfile txt file.txt --slurpfile json file.json ' $txt | split("\n") | .[:-1] | zip($json) | map({example: .[0], tags: .[1]}) | .[]' | jq -c .
若要将结果存入Bash数组,方便后续操作:
readarray -t finals < <(jq -n --rawfile txt file.txt --slurpfile json file.json ' $txt | split("\n") | .[:-1] | zip($json) | map({example: .[0], tags: .[1]}) | .[]' | jq -c .) # 遍历数组示例 for item in "${finals[@]}"; do echo "$item" done
命令说明
--rawfile txt file.txt:将file.txt内容以原始字符串形式读入jq变量$txt。--slurpfile json file.json:将file.json中所有独立JSON对象读入jq数组变量$json。split("\n"):拆分文本为行数组,.[:-1]用于移除文件末尾换行生成的空行。zip($json):将文本行数组与JSON对象数组按索引一一配对。map(...):将每对(文本行+JSON对象)构造成目标格式的JSON对象。jq -c .:将JSON压缩为单行,便于赋值给变量或批量处理。
为什么不推荐paste+循环?
手动用paste拼接后拆分,极易因JSON对象中的换行、引号等特殊字符导致格式错误,且需自行处理转义,复杂度高且易出错,jq能原生处理JSON语法,从根源避免这类问题。
内容的提问来源于stack exchange,提问作者Junk
相关产品推荐
相关产品推荐

