You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用jq根据命令行参数生成指定格式的JSON输出?

解决jq中使用--arg参数替换变量的问题

你遇到的核心问题是:你把带$id这类占位符的JSON当作输入传给jq,但只用了.作为filter——这个filter的作用就是原封不动输出输入内容,所以输入里的$id只是普通字符串,根本不会被你用--arg传入的变量替换。

要实现你想要的效果,有两种更合适的方式:

方式一:直接用jq的filter构造目标JSON

不需要提前写JSON模板,直接在jq的filter里生成你要的结构,这样--arg传入的变量可以直接在filter中使用:

jq --arg id "1234" \
   --arg song "Yesterday" \
   --arg artist "The Beatles" \
   '{ "records": [ { "id": $id, "song": $song, "artist": $artist } ] }'

这个命令里,{ "records": [...] }就是jq的filter,它会直接生成对应的JSON结构,并且自动把你传入的变量填充进去。

方式二:用filter修改JSON模板(如果一定要用模板的话)

如果想基于一个JSON模板来修改,那需要在filter里明确指定替换每个字段的逻辑,而不是只用.

jq --arg id "1234" \
   --arg song "Yesterday" \
   --arg artist "The Beatles" \
   '.records[0].id = $id | .records[0].song = $song | .records[0].artist = $artist' \
   <<<'{ "records": [ { "id": "", "song": "", "artist": "" } ] }'

这里的filter用管道符|串联了三个赋值操作:分别把records数组第一个元素的idsongartist字段替换成你传入的变量,这样就能得到正确的输出了。

简单来说,jq的filter是用来处理或生成JSON的表达式,不是简单的“传递输入”——你之前的.只是最基础的filter,没有任何修改逻辑,所以才会输出原样的占位符。

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

火山引擎 最新活动