Как передать переменную в JQ выбор / содержит запрос - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь передать две переменные в запрос 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 голосов
/ 20 сентября 2018

Во-первых, показанный ввод не является ни действительным 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.

...