다운로드한 파일의 이름을 "친숙한" 방식으로 바꿀 수 있도록 json
구문 분석하려는 파일이 있습니다 . 내가 사용하는 것의 일부는 podfox
다음과 같습니다 .json
{
"episodes": [
{
"title": "Hired and Fired by Little Richard and Jimi\u2019s first trip on LSD",
"url": "https://www.podtrac.com/pts/redirect.mp3/chtbl.com/track/5899E/traffic.megaphone.fm/HSW2392375869.mp3",
"downloaded": true,
"listened": false,
"published": 1582203660.0
},
{
"title": "Stolen Cars, Broken Taboos, and the Search for Billy Davis",
"url": "https://www.podtrac.com/pts/redirect.mp3/chtbl.com/track/5899E/traffic.megaphone.fm/HSW5134475908.mp3",
"downloaded": true,
"listened": false,
"published": 1581598860.0
},
]
"shortname": "27 Club",
"title": "27 Club",
"url": "https://feeds.megaphone.fm/HSW5142951139"
}
url
그것을 가져 와서 title
의 변수에 전달 하려고 합니다 bash
. (대부분의 경우) 사용할 수 있지만 더 나은 방법이 grep
있다는 것을 알고 있지만 작동하는 구문을 jq
알 수 없습니다 .jq
이는 명령줄의 grep에 작동 grep -B 1 HSW2392375869.mp3 < feed.json | grep "title" | cut -d"\"" -f4
하지만 잠재적으로 오류가 발생하기 쉬운 솔루션처럼 보입니다.
시도할 때: jq -c '.["episodes"].url'
쉘이 무기한 정지됩니다. jq
여기서는 해당 항목이 필요하지 않으므로 url
(최종) 값 합계를 검색하고 반환할 수 있는 published
방법 이면 title
충분합니다.
답변1
.episodes
실제로 먼저 필터링 한 다음 내부 배열을 필터링해야 합니다.
jq ".episodes | .[0]" jsonfile
{
"title": "Hired and Fired by Little Richard and Jimi’s first trip on LSD",
"url": "https://www.podtrac.com/pts/redirect.mp3/chtbl.com/track/5899E/traffic.megaphone.fm/HSW2392375869.mp3",
"downloaded": true,
"listened": false,
"published": 1582203660
}
제목:
jq ".episodes| .[0].title" jsonfile
"Hired and Fired by Little Richard and Jimi’s first trip on LSD"
게시자:
jq ".episodes| .[0].published" jsonfile
1582203660
url
값 기반 쿼리 의 경우
jq '.episodes | .[] | select(.url=="https://www.podtrac.com/pts/redirect.mp3/chtbl.com/track/5899E/traffic.megaphone.fm/HSW2392375869.mp3").title' jsonfile
"Hired and Fired by Little Richard and Jimi’s first trip on LSD"
jq '.episodes | .[] | select(.url=="https://www.podtrac.com/pts/redirect.mp3/chtbl.com/track/5899E/traffic.megaphone.fm/HSW2392375869.mp3").published' jsonfile
1582203660
답변2
URL을 사용하여 JSON 파일을 쿼리하고 해당 URL에 해당하는 출판 날짜와 제목을 셸 변수로 가져오려고 합니다.
url='http://example.com/some/path'
title=unknown
published=unknown
eval "$(
jq -r --arg url "$url" '.episodes[] | select(.url == $url) |
@sh "title=\(.title); published=\(.published)"' file.json
)"
printf 'title = "%s"\n' "$title"
printf 'published = "%s"\n' "$published"
그러면 배열의 개체를 쿼리하여 episodes
올바른 URL이 있는 개체를 찾습니다. 찾은 경우 이 표현식은 jq
변수 sum 에 대한 두 개의 변수 할당을 포함하는 title
쉘 코드를 출력합니다 published
. 쉘은 printf
.
일치하는 항목이 없으면 변수가 변경되지 않습니다.