다양한 JSON 문자열의 값을 구문 분석합니다(jq 제외).

다양한 JSON 문자열의 값을 구문 분석합니다(jq 제외).

저는 JSON 출력을 읽고 다양한 JSON 변수나 문자열의 값을 구문 분석해야 하는 bash 스크립트를 작업 중입니다. 샘플 출력입니다. Content다른 변수 옆이나 다른 변수에서 값을 읽어야 합니다 . 예를 들어,

을 찾아서 Content인쇄할 수 있습니다 Value1.

찾아 DeviceType인쇄할 수 있습니다.Value4

샘플 출력: {"Content":"Value1","CreationMethod":"Value2","database":"Value3","DeviceType":"Value4"}

sed와 awk의 조합을 시도했지만 출력에서 sed 's/["]/ /g' | awk '{print $4}'​​위치가 동일하게 유지되는 경우에만 가능했습니다 . 그렇지 않으면 값이 범위를 벗어나는 위치 변경으로 인해 Content다른 JSON 출력에서 ​​잘못된 값이 선택 됩니다.Contentawk '{print $4}'

답변1

글쎄, 내가 올바르게 이해했다면 GNU를 사용하여 다음을 수행 grep하십시오 tr.

tr ',' '\n' < foo | grep -Po "(?<=Content\":\").*(?=\")"

산출:

Value1

다른 키워드 사용:

tr ',' '\n' < foo | grep -Po "(?<=database\":\").*(?=\")"

Value 3

새 줄에서 쉼표를 바꾸십시오.

tr ',' '\n'

Grep은 정규 표현식과 마찬가지로 Perl -o전용 입니다.-P

grep -Po

패턴 캡처 ("<keyword>:"")<value>(")및 인쇄오직 <value>.

답변2

jq점점 더 perl적은 수의 망치로 OP의 의도를 사용합니다 sed/awk

s="Content"; sed 's/[{}"]//g' file | awk -v s=$s -F ":" -v RS=',' '($1 == s) {print $2}'

답변3

알았어, 형편없다는 건 인정해…

$ awk 'BEGIN {FPAT="\"[^\"]+\""; RS=","; pat=ARGV[1]; delete ARGV[1]} 
     $1 ~ pat {print $2} '       Content ex.json
"Value1"

답변4

$ jq -r '.Content' file
Value1
$ jq -r '.DeviceType' file
Value4

JSON을 정확하고 안전하게 구문 분석하기 위해 설치하지 않을 이유가 없으며 jq, JSON 인코딩 문자열 등을 수동으로 디코딩하는 것에 대해 걱정할 필요가 없습니다.

jq실용적인 사항다운로드 가능루트 권한 없이 홈 디렉터리에 설치됩니다(외부 런타임 종속성 없음).

관련 정보