BashでJSON変換用の引用符をエスケープする方法

BashでJSON変換用の引用符をエスケープする方法

JSON文字列に変換する必要があるファイルがありますbash

私のテストファイルは次のとおりです

1
2
'
3
4

これはどうしたの?

$ LOG=$(cat file)
$ printf '{"log": "%q"}\n' "$LOG"
{"log": "$'1\n2\n\'\n3\n4'"}

改行や処理するように、状況は大丈夫に見えますが、始めと終わりにaを追加する'ようです。$''

答え1

一重引用符は、JSON値に含めるために特別な処理を必要としません。二重引用符、改行、タブなどはエスケープまたはエンコードする必要があります。 JSON認識ツールを使用すると、これを行うのが最も簡単です。私は言及しましたjoそしてjq次のような。


jo log=@file

これは、ファイルの内容で構成されたJSONエンコード文字列値を持つjo単一のキーを使用してJSON文書を生成するために使用されます。logfile

質問のデータ出力を提供します。

{"log":"1\n2\n'\n3\n4"}

以下を使用してbase64でエンコードされたデータを取得することもできます。

jo log=%file

(これはきちんとした機能なのでこれだけ言及しますjo。)

出力:

{"log":"MQoyCicKMwo0Cg=="}

使用jq:

jq -c -Rs '{ log: . }' file

これは生の入力を読み取り、fileそれを単一の文字列に変換します。この文字列はlog出力オブジェクトのキー値として使用されます。

質問のデータ出力を提供します。

{"log":"1\n2\n'\n3\n4\n"}

(最終改行文字はここに保存されますが、出力には保存されませんjo。)

Base64でエンコードされたデータを取得するには(必要に応じて):

jq -c -Rs '{ log: (.|@base64) }' file

答え2

最も簡単な方法は、3つを連続して使用し、printf基本項目を次に%s置き換えることです%q

$ printf '{"log": "'; printf '%s\\n' $(<file); printf '"}\n'
{"log": "1\n2\n'\n3\n4\n"}

関連情報