Как передать переменную в JQ выбор / содержит запрос

Я пытаюсь передать две переменные в 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 ответ

Решение

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

Другие вопросы по тегам