ファイルにデータを追加して使用します。
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.txt
JSONではなくプレーンテキストなので、有効な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.txt
tail
sponge
また、なぜecho
? tail -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オブジェクトを取得しました。
動作する唯一の方法は、最後の行を除くすべての行の末尾にカンマを置くことです。
これが完璧で正しいアプローチであるかどうかはわかりません。しかし、それは私の問題に効果がありました。