1

我正在尝试将两个变量传递给 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"
4

1 回答 1

4

首先,显示的输入既不是有效的 JSON,也不是有效的 JSON 文档流。由于您使用过..|objects,我假设您的意图是输入是一个数组。

其次,-n 选项的意思是:不自动读取 STDIN 或指定文件。既然你用过cat,那我就放弃吧。

第三,您使用了 $TESTDATE 和 $test1 却没有给出样本值。我将使用下面显示的变量和值。

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

第五,这是一个小问题,但我会失去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但是,它是一个有趣的野兽,通常我建议使用它index

于 2018-09-20T16:45:35.617 回答