JSON 문자열로 변환해야 하는 파일이 있는데 이를 bash
.
내 테스트 파일은 다음과 같습니다
1
2
'
3
4
이게 무슨 일이야
$ LOG=$(cat file)
$ printf '{"log": "%q"}\n' "$LOG"
{"log": "$'1\n2\n\'\n3\n4'"}
개행 및 을 처리하는 것처럼 상황은 괜찮아 보이지만 시작 부분과 끝 부분에 a를 추가하는 '
것 같습니다.$'
'
답변1
작은따옴표는 JSON 값에 포함되기 위해 특별한 처리가 필요하지 않습니다. 큰따옴표, 줄바꿈, 탭 등은 이스케이프하거나 인코딩해야 합니다. JSON 인식 도구를 사용하면 이 작업을 수행하는 것이 가장 쉽습니다. 나는 언급했다jo
그리고jq
다음과 같은.
jo log=@file
이는 파일 내용으로 구성된 JSON 인코딩 문자열 값을 갖는 jo
단일 키를 사용하여 JSON 문서를 생성하는 데 사용됩니다 .log
file
질문의 데이터 출력을 제공합니다.
{"log":"1\n2\n'\n3\n4"}
다음을 사용하여 base64로 인코딩된 데이터를 얻을 수도 있습니다.
jo log=%file
(나는 이것이 깔끔한 기능이기 때문에 이것만 언급합니다 jo
.)
산출:
{"log":"MQoyCicKMwo0Cg=="}
사용 jq
:
jq -c -Rs '{ log: . }' file
이는 원시 입력을 읽고 file
이를 단일 문자열로 변환합니다. 이 문자열은 log
출력 객체의 키 값 으로 사용됩니다 .
질문의 데이터 출력을 제공합니다.
{"log":"1\n2\n'\n3\n4\n"}
(최종 개행 문자는 여기에 보존되지만 출력에는 보존되지 않습니다 jo
.)
Base64로 인코딩된 데이터를 얻으려면(원하는 경우):
jq -c -Rs '{ log: (.|@base64) }' file
답변2
가장 간단한 방법은 3개를 연속으로 사용하고 printf
기본 항목을 다음으로 %s
바꾸는 것 입니다 %q
.
$ printf '{"log": "'; printf '%s\\n' $(<file); printf '"}\n'
{"log": "1\n2\n'\n3\n4\n"}