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

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

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

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に書き込むストリームプロセッサと考える方が効率的です。

答え2

努力する:

value=$(perl -e 'print qx/cat newdata.txt/;')

これにより、「-e」を使用して、コンパイラによって実行されるPerlコードを定義できます。

$()を使用すると、コマンドの出力をキャプチャしてシェル変数に割り当てることができます。

答え3

私はそれについて考えた。もし必要な方のために回答を上げます。次のように、newdata.txtというファイルにデータを追加します。echo "$(tail -n10 newdata.txt)" > newdata.txt;

次に、ファイルをvalue:value = "$(cat newdata.txt)"という変数にコピーしました。

完了したら、echo "{\"Values\":[$value]}" | jq .JSONオブジェクトを取得しました。

動作する唯一の方法は、最後の行を除くすべての行の末尾にカンマを置くことです。

これが完璧で正しいアプローチであるかどうかはわかりません。しかし、それは私の問題に効果がありました。

関連情報