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文書を生成するために使用されます。log
file
質問のデータ出力を提供します。
{"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"}