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

bash调用jq循环提取字段写入文件时内容不换行问题

问题根因

  1. 无引号包裹的命令替换会丢失换行符:当你执行echo $(_jq '.dependencies[].name')时,Bash会对命令替换返回的结果做字段分割,把原有的换行符、制表符等空白字符统一替换为单个空格,最终输出的就是空格分隔的单行内容。
  2. 外层循环逻辑冗余:你对整个JSON对象执行@base64转码只会得到1个结果,外层for循环实际仅执行1次,完全没有起到遍历dependencies数组的作用。

解决方案

方案1:最小改动修复现有写法

给命令替换加上双引号,保留输出内容的原始换行符即可:

#!/bin/bash

for row in $(jq -r '. | @base64' recipe.json); do
    _jq() {
     echo "${row}" | base64 --decode | jq -r "${1}"
    }
   # 为命令替换加双引号保留换行
   echo "$(_jq '.dependencies[].name')" >> file.log
done

方案2:简化冗余逻辑(更推荐)

你要提取所有依赖的名称,完全不需要额外做base64转码和循环,一行jq命令即可实现需求:

#!/bin/bash
jq -r '.dependencies[].name' recipe.json >> file.log

如果你需要逐行处理每个依赖名称,可搭配while read实现:

#!/bin/bash
while IFS= read -r dep_name; do
  # 此处可添加针对单个依赖名称的处理逻辑
  echo "${dep_name}" >> file.log
done < <(jq -r '.dependencies[].name' recipe.json)

以上方案执行后,file.log中会分两行保存ethereal和new两个值。

内容的提问来源于stack exchange,提问作者dani 'SO learn value newbies'

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:06:06