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
相关产品推荐
相关产品推荐

