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

Bash中用jq提取JSON字段拼接前缀后追加写入文件的方法

bash下jq拼接镜像地址追加写入文件实现方法

核心修改点

原命令有两个需要调整的地方:

  • 原命令用>重定向会直接覆盖output.txt原有内容,要保留文件里已经存的仓库地址,必须改用>>做追加写入
  • 需要在筛选出的path字段前拼接仓库地址前缀,以及需要的前置缩进

具体实现命令

方式1:直接指定仓库地址(推荐)

用jq内置的--arg参数传入仓库地址,避免shell转义问题,命令如下:

# 定义仓库地址,替换成实际使用的仓库地址即可
DOCKER_REPO="docker-virtual.artifactory.com"

# 筛选docker类型依赖、拼接完整地址后追加写入文件
# 字符串开头的8个空格对应示例里的前置缩进,不需要可以直接删掉
jq -r --arg repo "$DOCKER_REPO" \
  '.dependencies[] | select(.type == "docker-image").path | "        \($repo)/\(.)"' \
  packages.json >> output.txt

执行后追加到文件的内容和预期格式完全一致:

docker-virtual.artifactory.com/redis:6.0.10-alpine3.12
        docker-virtual.artifactory.com/jboss/keycloak:12.0.1

方式2:自动读取output.txt中已存的仓库地址

如果不想硬编码仓库地址,要直接读取output.txt里已经保存的仓库地址做拼接,可以用下面的命令:

# 读取output.txt第一行存储的仓库地址,如果存地址的行不是第一行,修改head的参数即可
EXISTED_REPO=$(head -n 1 output.txt)

# 拼接追加写入
jq -r --arg repo "$EXISTED_REPO" \
  '.dependencies[] | select(.type == "docker-image").path | "        \($repo)/\(.)"' \
  packages.json >> output.txt

注意事项

  • 不要把追加写的>>写成覆盖写的>,否则会清空文件里之前存的仓库地址
  • 如果不需要前置缩进,直接删掉拼接字符串里开头的8个空格即可,输出就是标准的仓库地址/镜像名:标签格式
  • 用--arg传参比直接在shell里拼接字符串兼容性更好,不会因为地址里有特殊字符导致jq执行报错

内容的提问来源于stack exchange,提问作者Santoshkumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:06:43