Bash에서 JSON 변환을 위해 따옴표를 이스케이프 처리하는 방법

Bash에서 JSON 변환을 위해 따옴표를 이스케이프 처리하는 방법

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 문서를 생성하는 데 사용됩니다 .logfile

질문의 데이터 출력을 제공합니다.

{"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"}

관련 정보