내 awk
출력은 여러 줄 문자열입니다.
awkresult=`awk '{...}'`
echo "{ \"result\": \"$awkresult\" }" > result.json
결과 문자열에는 여러 줄이 유지되어야 합니다.
내 생각에 가장 좋은 방법은 각 줄의 끝에 개행 문자를 삽입하는 것입니다 awkresult
.
내 awk
스크립트를 수정할 수 없습니다. 코드를 어떻게 수정해야 합니까?
답변1
값의 줄 바꿈은 JSON으로 인코딩되어야 합니다 \n
. JSON 파서는 이를 실제 개행 문자로 디코딩합니다. 삽입하다단어JSON 파일의 값에 줄 바꿈 문자가 있으면 JSON 문서가 손상될 수 있습니다.
사용jo
(올바른 인코딩 등을 사용하여 셸에서 JSON 출력을 생성하는 도구):
awkresult='some string
with newlines
the end'
jo result="$awkresult"
결과는 다음과 같습니다.
{"result":"some string\nwith newlines\nthe end"}
예쁜 인쇄:
jo -p result="$awkresult"
이로 인해
{
"result": "some string\nwith newlines\nthe end"
}
출력을 jo
파일로 리디렉션하여 출력을 저장합니다.
jo result="$awkresult" >result.json
답변2
여기에서 다음과 같이 설명서를 사용할 수 있습니다.
echo "$(cat <<EOM
{ "result" : "$awkresult" }
EOM
)" > result.json
echo 문에서 큰따옴표 "를 참고하세요. 모든 줄 바꿈이 유지되므로 내부의 \" 따옴표를 이스케이프 처리할 필요가 없습니다.
답변3
귀하의 생각은 정확하지만 JSON 문자열을 인코딩하는 데 큰따옴표를 사용하지 마십시오. 주위에 작은 따옴표를 사용 하고 작은 따옴표 내부를 {..}
확장하려면 특수 따옴표 순서를 사용하십시오.awkresult
awkresult='foo\nbar\nzoo\n'
이제 변수를 다음과 같이 사용하십시오.
echo '{ "result": "'"$awkresult"'" }' > result.json
또한 JSON 사양에서는 포함된 텍스트 래핑 제어 문자를 허용하지 않습니다. JSON 스니펫이 유효한지 확인할 수 있습니다.
echo '{ "result": "'"$awkresult"'" }' | jq .
{
"result": "foo\nboo\nbar\n"
}
답변4
게시한 코드는 다음 위치에 개행 문자를 유지합니다 $awkresult
.
$ awkresult='foo
bar'
$ echo "{ \"result\": \"$awkresult\" }"
{ "result": "foo
bar" }
하지만 더 간단하고, 더 강력하고, 더 이식 가능한 방법이 있습니다.
awkresult="$(awk '{...}')"
printf '{ "result": "%s" }\n' "$awkresult" > result.jso
\n
아니면 개행 문자를 다음과 같은 문자열로 바꿔야 한다는 뜻인가요?
$ printf '{ "result": "%q" }\n' "$awkresult"
{ "result": "$'foo\nbar'" }
아니면 다른 것입니까?