Ash Shell에서 JSON 응답의 특정 부분을 필터링하는 방법

Ash Shell에서 JSON 응답의 특정 부분을 필터링하는 방법

-qO와 함께 wget을 사용하여 OpenELEC의 특정 업데이터 URL에 액세스합니다. 이는 아래와 유사한 JSON 응답을 제공합니다.

{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","host":"","MD5":""}}

tar의 전체 파일 이름만 필요하고 다른 것은 필요하지 않습니다.

기타 원치 않는 정보를 모두 필터링하는 가장 좋은 방법은 무엇입니까?

답변1

할 것입니다 :

$ jq ".data.update" <<< '{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","host":"","MD5":""}}'
"OpenELEC-RPi2.arm-5.0.8.tar"

또는 다음과 같이 -r:

jq -r ".data.update" <<< '{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","host":"","MD5":""}}'
OpenELEC-RPi2.arm-5.0.8.tar

따옴표 없이 (원시) 문자열을 가져옵니다.

답변2

FloHimself가 말했듯이 실제 JSON 파서를 사용해야 합니다. 간단한 텍스트 프로세서로는 쉽게 처리할 수 없는 극단적인 경우가 많이 있습니다.

이 경고와 함께:

sed 's/.*"update":"\([^"]\+\)".*/\1/'

답변3

JSON을 다음과 같은 파일에 저장한다고 가정합니다 jsonfile.

awk -F "update" '{print $2}' jsonfile | awk -F ":" '{print $2}' | awk -F "," '{ gsub(/"/,"" ); print $1}'

결과를 줄 것입니다 OpenELEC-RPi2.arm-5.0.8.tar.

이는 JSON 파서가 아니므로 항상 예제와 동일한 구조를 사용하는 경우 작동합니다.

답변4

를 사용하여 sed출력을 wget다음으로 파이프합니다.

sed -n 's/^.*{"update":"\([^"]*\)".*$/\1/p'

이는 {"update":반환된 문자열의 일부와 일치한 다음 일치된 부분 뒤에 큰따옴표로 묶인 내용을 추출합니다.

관련 정보