ファイルを読み取り、変数に保存する方法は?

ファイルを読み取り、変数に保存する方法は?

ファイルにデータを追加して使用します。

echo "$(tail -n10 newdata.txt)" > newdata.txt;

ファイルには10行しか残りませんnewdata.txt

このファイルを読み、すべての内容を変数に保存して実行するとき

{"Value":" "} | jq .

JSONファイルを作成します。 1つのキーに10個の値をすべて書き込むことができますvalue

頑張った

value=cat newdata.txt

ただし、これにより解析エラーが発生します。

Invalid string: control characters from U+0000 through U+001F must be escaped.

ベストアンサー1

これは一つですXYの問題。ファイルの内容をnewdata.txt変数に割り当てるには、lines次のようにします。

lines="$(cat newdata.txt)"

newdata.txtしかし、なぜ変数に内容を割り当てるのですか?

予想される結果は、フィールドに値をvalue含むJSONオブジェクトですnewdata.txt。の内容はnewdata.txtJSONではなくプレーンテキストなので、有効なJSONを読む必要があるため、echo{"value", $(cat newdata.txt)}またはそれに対応する機能は機能{"value", $lines}jq .ません。jq

実際の質問は次のとおりです。プレーンテキスト行をJSONに変換するには?

jqオプションを使用して、すべての入力行をJSON文字列ストリームに解析できます-R--raw-inputすべての入力行を一度に解析するには、オプション、-sを使用します--slurp。その後、入力は通常のjqストリーム処理に使用できるため、次のようになります。

jq -sR '{"value", .}' newdata.txt

必要なJSONオブジェクトを提供します。

一方、echo "$(tail -n10 newdata.txt)" > newdata.txt断続的に失敗するしかありません。最後の10行を読む前にゼロバイトに>newdata.txt切り捨てられる可能性が高いです。これを使用してこの問題を解決できますが、以下を参照してください。newdata.txttailsponge

また、なぜechotail -n 10すでにstdoutにエコーされているので、出力を文字列としてキャプチャする必要はなく、echo再びstdoutにエコーするだけです。

これらすべてを組み合わせると、1行の解決策は次のようになります。

tail -n 10 olddata.txt | tee newdata.txt | jq -sR '{"value", .}' && 
mv newdata.txt olddata.txt

bash変数、文字列など、他のプログラミング言語のすべての機能を備えていますが、stdinで読み込んでstdoutに書き込むストリームプロセッサと考える方が効率的です。

おすすめ記事