개행 문자가 포함된 파일이 있습니다. 파일을 서버에
게시 하면 서버가 이를 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\""