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

それとも別のものですか?

関連情報