json의 개행 문자를 이스케이프 처리하는 방법은 무엇입니까?

json의 개행 문자를 이스케이프 처리하는 방법은 무엇입니까?

개행 문자가 포함된 파일이 있습니다. 파일을 서버에
게시 하면 서버가 이를 json으로 구문 분석합니다. 개행 문자로 인해 요청을 거부합니다. 하지만 내가 이렇게 하면: curl

$(echo "$MY_DATA" | sed 's/$//' | tr -d '\n\r')  

작동하지만 새 줄 문자가 사라집니다.
줄 바꿈을 유지하기 위해 텍스트를 이스케이프하는 방법은 무엇입니까?
시도했지만 두 방법 모두 작동하지 tr '\n' '\\n'않습니다sed 's/\n/\\n/g

답변1

\n원래 개행 문자를 (백슬래시 및 ) 로 변경하고 싶다고 가정합니다 n.

tr '\n' '\\n'개행 문자를 백슬래시로 변경합니다(그리고 n두 번째 그룹에 추가 문자가 포함됩니다). 개행을 끝내는 줄은 버퍼에 로드되지 않고 내부적으로 처리되기 sed 's/\n/\\n/g때문에 작동하지 않습니다 .sed

일부 대안은 다음과 같은 GNU sed입니다 -z(입력을 개행으로 구분하지 않고 NUL로 구분된 "줄"로 사용).

sed -z 's/\n/\\n/g'

그리고 Perl(sed와 달리하다버퍼에서 개행 문자를 가져와서 s///처리합니다.)

perl -pe 's/\n/\\n/g'

( tr -d '\n\r'그것은 정확히 당신이 요청한 대로 개행 문자를 제거합니다.)

답변2

jq데이터의 올바른 JSON 인코딩을 위해 :

printf '%s' "$MY_DATA" | jq -sR .

-s( --slurp) 및 -R( ) 옵션을 --raw-input함께 사용하면 원시 입력 데이터를 읽고 여기에서 단일 JSON 인코딩 문자열을 생성합니다.

예:

MY_DATA='line 1
line 2 contains a literal tab   <-- there
line 3 "the end"'

printf '%s' "$MY_DATA" | jq -sR .

산출:

"line 1\nline 2 contains a literal tab\t<-- there\nline 3 \"the end\""

관련 정보