Jq如何忽略键值中的空白字符 解决shell遍历异常换行问题
问题根源
异常换行不是jq查询写法错误导致的,是Shell默认的for遍历规则会把所有空白字符(空格、制表符、换行)识别为条目分隔符。只要键名或者值内容里包含空格,原本完整的key:value条目就会被拆成多段,每段单独触发一次循环,最终输出就会出现多余换行。
正确实现方案
jq本身的查询逻辑不需要调整,和你调试通过的写法完全一致,只需要修改Shell遍历结果的逻辑即可,推荐用更稳妥的流式读取写法:
jq -r '.DesignCode | to_entries[] | "\(.key):\(.value)"' "$basename/test.json" | while IFS= read -r item; do printf "%s\n" "$item" # 此处编写单条key:value结果的处理逻辑 done
写法说明:
- 不需要用
cat传递文件内容给jq,jq原生支持直接读取文件路径,执行效率更高 IFS= read -r是Shell按行读取的标准写法,能保证读取过程不丢失行首尾空白、不自动转义特殊字符- 直接通过管道逐行读取jq输出,只会按jq生成的换行符拆分条目,键、值内部的空白字符不会被当成分隔符,完全不会出现异常拆分问题
如果业务逻辑要求必须先把所有查询结果存到变量再遍历,可以临时修改Shell的字段分隔符配置,遍历完成后恢复原配置:
# 备份原有分隔符配置 OLD_IFS=$IFS # 将分隔符临时设置为仅换行符 IFS=$'\n' query=$(jq -r '.DesignCode | to_entries[] | "\(.key):\(.value)"' "$basename/test.json") for i in $query; do printf "%s\n" "$i" # 此处编写单条key:value结果的处理逻辑 done # 恢复原有分隔符配置,避免影响后续脚本逻辑 IFS=$OLD_IFS
注意:如果采用存变量再遍历的方案,一定要记得恢复IFS原始值,否则全局分隔符被修改会导致脚本后续其他逻辑出现异常。
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

