如何用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数组第一个元素的id、song、artist字段替换成你传入的变量,这样就能得到正确的输出了。
简单来说,jq的filter是用来处理或生成JSON的表达式,不是简单的“传递输入”——你之前的.只是最基础的filter,没有任何修改逻辑,所以才会输出原样的占位符。
内容的提问来源于stack exchange,提问作者towi




