如何将变量传递到JQ select / contains查询

时间:2018-09-20 16:05:46

标签: json jq parameterization

我正在尝试将两个变量传递给jq查询。

我的JSON

 {
 "AlbumTitle": "Name Of Album",
 "AlbumLink": "/album/link/id/1/album-name/",
 "ArtistName": "Artist Name",
 "Date": "September 14, 2018"
 },
 {
 "AlbumTitle": "Name Of Album",
 "AlbumLink": "/album/link/id/2/album-name/",
 "ArtistName": "Artist Name",
 "Date": "September 13, 2018"
 }

我有两个变量,分别是“日期”和“艺术家名称”,我试图根据变量来拉回ArtistLink。

我正在使用下面的JQ行。

 cat test.json | jq -n -r --arg TESTDATE "$TESTDATE" '.. | objects | {select(.Date == '"$TESTDATE"')} | select(.ArtistName | contains('"$test1"')) | .AlbumLink'

我得到了错误

 "jq: error: syntax error, unexpected '(', expecting '}'      (Unix shell quoting issues?) at <top-level>, line 1:
 .. | objects | {select(.Date == September 13, 2018)} | select(.ArtistName | contains(Artist)) | .AlbumLink                      
 jq: 1 compile error"

1 个答案:

答案 0 :(得分:1)

首先,显示的输入既不是有效的JSON也不是有效的JSON文档流。既然你已经 用过 val value: JsValue = Json.parse("{ \"name\" : \"hello\" , \"lastLogin\" : {\"$ldt\":\"2018-09-09T11:06:27.655\"} }") (means User is defined by: "name\":\"myName\", \"active\":true, \"lastLogin\":{\"$ldt\":\"2018-09-09T11:06:27.655\"} } ) ,我假设您的意图是输入为数组。

第二,-n选项表示:不要自动读取STDIN或指定的文件。既然你已经 用过..|objects,我将其删除。

第三,您使用了$ TESTDATE和$ test1而不给出示例值。我要用 下面显示的变量和值。

第四,通常最好使用--arg或--argjson选项传递参数值, 就像您为$ TESTDATE所做的一样,而不是$ test1。

第五,这是次要的要点,但是我要丢掉cat:请参阅Useless use of cat?

将它们放在一起,我们可以这样写:

cat

testdate="September 13, 2018" testname="Artist Name" < test.json jq -r --arg testdate "$testdate" --arg testname "$testname" ' .[] | select((.Date == $testdate) and (.ArtistName | contains($testname))) | .AlbumLink ' 是有趣的野兽,通常我建议改用contains