如何修改JQ过滤器,生成逗号分隔的键值对?
问题描述
现有如下Bash脚本:
#!/bin/bash js="{\"fizz\":\"buzz\",\"foo\":\"baz\"}" echo $js json=$(echo "$js" | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]") echo "fetching secret json:" echo $json
运行后输出为:
myuser@mymachine myapp % bash myscript.sh {"fizz":"buzz","foo":"baz"} fetching secret json: fizz=buzz foo=baz
实际使用的JSON包含更多扁平键值对(无嵌套对象),需要将输出的键值对改为逗号分隔的形式,即得到:
fizz=buzz,foo=baz
解决方案
直接修改JQ过滤器即可实现需求,推荐使用join(",")替代原过滤器末尾的.[],修改后的脚本如下:
#!/bin/bash js="{\"fizz\":\"buzz\",\"foo\":\"baz\"}" echo $js json=$(echo "$js" | jq -r 'to_entries | map("\(.key)=\(.value|tostring)") | join(",")') echo "fetching secret json:" echo $json
原理说明
- 原过滤器中的
.[]会将数组内的每个键值对单独输出(每行一个),后续通过Bash变量展开时换行被替换为空格,最终得到空格分隔的结果。 - 改用
join(",")后,JQ会直接将数组中的所有键值对用逗号连接成单个字符串输出,无需依赖Bash处理换行和空格,避免了值中包含空格时出现的异常问题,结果更可靠。
运行修改后的脚本,输出将符合预期:
myuser@mymachine myapp % bash myscript.sh {"fizz":"buzz","foo":"baz"} fetching secret json: fizz=buzz,foo=baz
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

