You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:09:25