如何使用JQ将对象列表转换为带对象字段的格式化字符串
解决方法
直接使用如下jq命令即可得到目标格式输出:
# 从文件读取的场景 jq -r 'map("--metadata \"key\": \"\(.key)\", \"value\": \"\(.value)\"") | join(" ")' 你的输入文件路径 # 管道输入的场景 echo '[{"key":"Name","value":"John"},{"key":"City","value":"New York"},{"key":"Country","value":"USA"}]' | jq -r 'map("--metadata \"key\": \"\(.key)\", \"value\": \"\(.value)\"") | join(" ")'
执行后输出内容完全符合你的需求:
--metadata "key": "Name", "value": "John" --metadata "key": "City", "value": "New York" --metadata "key": "Country", "value": "USA"
原理说明
之前操作报错的原因
- 你之前的
map语句生成的是对象数组,而join函数仅支持拼接字符串数组,对象无法直接拼接,因此抛出错误。 - 没有加
-r(原始输出)参数时,jq默认会将输出结果按JSON格式处理,给字符串额外包裹双引号,不符合命令行参数的要求。
正确命令的逻辑拆解
- 字符串模板与插值:jq中使用
\(变量名)的语法实现字符串插值,可以直接把.key、.value的变量值插入到自定义的字符串模板中。 - 双引号转义:在jq的双引号包裹的字符串内,要输出字面量双引号需要用反斜杠转义,也就是
\"。 - map转换为字符串数组:遍历原始JSON数组的每个元素,将每个对象转换为
--metadata "key": "xxx", "value": "yyy"格式的字符串,得到全字符串组成的数组。 - join拼接:用空格将字符串数组的所有元素拼接为一个完整的长字符串。
- -r参数:输出原始纯文本,避免jq自动给结果加JSON格式的外层双引号。
内容的提问来源于stack exchange,提问作者techQueriesJQ JQ
相关产品推荐
相关产品推荐

