Bash: 여러 줄 문자열에서 JSON을 작성하는 방법 [닫기]

Bash: 여러 줄 문자열에서 JSON을 작성하는 방법 [닫기]

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

아니면 다른 것입니까?

관련 정보