일부 키-값 쌍을 반환하는 JSON 문자열이 있지만 값이 숫자인 경우 큰따옴표로 묶지 않으므로 이러한 경우 JSON 구문 분석이 작동하지 않습니다.
내 생각은 다음을 제외한 모든 항목을 검색하고 교체하여 문자열을 조작하는 것입니다. :
여는 :"
중괄호 {
또한 끝 부분에서 큰따옴표를 닫아야 하므로 0-9 뒤에 쉼표가 오는 것을 찾아 해당 쉼표를 다음으로 바꾸는 방법을 찾아야 합니다.",
"{
검색/교체하려면 SED가 필요하다고 생각하지만 SED 및 RegEx를 처음 접했기 때문에 시작하는 방법, 특히 찾은 위치를 생략하고 RegEx를 사용하여 찾는 방법을 모릅니다.[0-9],
샘플 JSON 문자열은 다음과 같습니다.
{"data":{"project":{"issue":{"session":{"id":"625fdv6b95e232f08d6cy2686624f315","createdAt":1539849060000,"buildVersionId":"75492373","sdk":{"display":"1.11.1"},"os":{"platform":"unknown","modified":false},"memory":{"free":853000192,"used":1896611840},"storage":{"free":241791528960,"used":14197940224},"device":{"architecture":"arm64","manufacturer":"Samsung"}}}}}}
변경 후 필요한 완료 JSON은 다음과 같습니다.
{"data":{"project":{"issue":{"session":{"id":"625fdv6b95e232f08d6cy2686624f315","createdAt":"1539849060000","buildVersionId":"75492373","sdk":{"display":"1.11.1"},"os":{"platform":"unknown","modified":false},"memory":{"free":"853000192","used":"1896611840"},"storage":{"free":"241791528960","used":"14197940224"},"device":{"architecture":"arm64","manufacturer":"Samsung"}}}}}}
거의 동일하지만 이제 각 숫자에는 큰따옴표가 있습니다.
답변1
어때요?
sed 's/:\([0-9]*\)\([,}]\)/:"\1"\2/g' inp >out
s/:\([0-9]*\)\([,}]\)
-:
숫자 다음에,
또는 을 입력하여 검색하세요}
. 캡처 \1에 숫자를 넣고 \2에,
or를}
넣습니다./:"\1"\2/g
- 다음으로 바꾸고:"
\1(숫자)을 캡처한 다음 로 캡처한 다음"
\2(원래 접미사 문자)를 캡처합니다.
예
$ cat inp
{"data":{"project":{"issue":{"session":{"id":"625fdv6b95e232f08d6cy2686624f315","createdAt":1539849060000,"buildVersionId":"75492373","sdk":{"display":"1.11.1"},"os":{"platform":"unknown","modified":false},"memory":{"free":853000192,"used":1896611840},"storage":{"free":241791528960,"used":14197940224},"device":{"architecture":"arm64","manufacturer":"Samsung"}}}}}}
$ sed 's/:\([0-9]*\)\([,}]\)/:"\1"\2/g' inp >out
$ cat desired
{"data":{"project":{"issue":{"session":{"id":"625fdv6b95e232f08d6cy2686624f315","createdAt":"1539849060000","buildVersionId":"75492373","sdk":{"display":"1.11.1"},"os":{"platform":"unknown","modified":false},"memory":{"free":"853000192","used":"1896611840"},"storage":{"free":"241791528960","used":"14197940224"},"device":{"architecture":"arm64","manufacturer":"Samsung"}}}}}}
$ diff out desired
$
답변2
저는 JSON 데이터를 수정하는 대신 큰따옴표를 찾는 대신 숫자 값에 대한 grep 연산을 다음과 같이 수정하는 다른 접근 방식을 취했습니다.
buildVersionId=`echo $jsonData | grep -m1 -oP '"buildVersionId"\s*:\s*\K[^"]+"'`
,"
그런 다음 마지막 2자( )를 제거하여 실제 숫자만 가져옵니다.
buildVersionId=${buildVersionId::${#buildVersionId}-2}
답변3
jq -c '(.. | select(numbers)) |= tostring' file >newfile
이 jq
명령은 문서의 위치에 관계없이 JSON 문서의 모든 숫자를 문자열로 변환합니다.
출력은 "컴팩트" 형식으로 파일에 기록됩니다 newfile
.
어떤 이유로 인해 JSON 문서를 쉘 변수에 넣는 경우 다음을 data
사용할 수 있습니다 .
jq -c -n --argjson d "$data" '$d | (.. | select(numbers)) |= tostring' >newfile