Bash에서 .json 구문 분석

Bash에서 .json 구문 분석

다운로드한 파일의 이름을 "친숙한" 방식으로 바꿀 수 있도록 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.

일치하는 항목이 없으면 변수가 변경되지 않습니다.

관련 정보