저는 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 출력에서 잘못된 값이 선택 됩니다.Content
awk '{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
실용적인 사항다운로드 가능루트 권한 없이 홈 디렉터리에 설치됩니다(외부 런타임 종속성 없음).