如何将变量传递给 JQ select/contains 查询
How to pass a variable into JQ select/contains query
我正在尝试将两个变量传递到 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"
首先,显示的输入既不是有效的 JSON 也不是有效的 JSON 文档流。既然你已经
使用 ..|objects
我假设你的意图是输入是一个数组。
其次,-n选项表示:不自动读取STDIN或指定文件。既然你已经
用过cat
,弃之
第三,你在没有给出样本值的情况下使用了$TESTDATE和$test1。我要用
下面显示的变量和值。
第四,一般最好使用--arg或--argjson选项传入参数值,
正如您为 $TESTDATE 而不是 $test1 所做的那样。
第五,这是一个小问题,但我要失去cat
:见Useless use of 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
。
我正在尝试将两个变量传递到 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"
首先,显示的输入既不是有效的 JSON 也不是有效的 JSON 文档流。既然你已经
使用 ..|objects
我假设你的意图是输入是一个数组。
其次,-n选项表示:不自动读取STDIN或指定文件。既然你已经
用过cat
,弃之
第三,你在没有给出样本值的情况下使用了$TESTDATE和$test1。我要用 下面显示的变量和值。
第四,一般最好使用--arg或--argjson选项传入参数值, 正如您为 $TESTDATE 而不是 $test1 所做的那样。
第五,这是一个小问题,但我要失去cat
:见Useless use of 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
。