2017-12-19 3 views
1

私は単純なJSONファイルを更新しようとしています(複数のキー/値のペアを持つ1つのオブジェクトで構成されています)、同じコマンドを使用していますが、異なる結果が得られます。私がしようとしているコマンドは次のとおりです。私はJSON値を変更するためにjqで同じ構文を使用していますが、一方のケースは動作しますが、他のbashインタラクティブをインタラクティブにする一方で、どうすればこの問題を解決できますか?

cat ~/Desktop/config.json | jq '.Option = "klay 10"' | tee ~/Desktop/config.json 

このコマンドは、完全に「klay 10」、私の意図した出力とminerOptionsキーの値を置き換えます。

次に、新しく更新されたファイルに対して同じプロセスを実行しようとします(値はその1つのキーに対して変更されます)。 ps残念ながら、何が起こっているかを示すのに役立たない。これは私が完全にキーの値を変更するには、最初のコマンドを取得した後に何をすべきかです:私が最後にやったように、割り当てられた結果とothOptionsキー値を置き換えるだろうと予想しているでしょう

cat ~/Desktop/config.json | jq ‘.othOptions = "-epool etc-eu1.nanopool.org:14324 -ewal 0xc63c1e59c54ca935bd491ac68fe9a7f1139bdbc0 -mode 1"' | tee ~/Desktop/config.json 

。私はstdoutをファイルに直接送信しようとしましたが、そこには結果もありませんでした。私はもう一度パイピングを試み、一時ファイルを作成して元に戻すように移動しましたが、同じコマンドとは対照的に、すべて>と全くゼロの出力を返します。私がプロセスをやめると、以前と同じ値になります。新しい値ではありません。

ここでは、入力がちょうど同じで、同じコマンドを引き起こしているのは何ですか?(2番目のキーは最初からあり、構造が同じです。オブジェクトなどを作成していません。それはtee可能性が考えられますが、ファイルへの標準出力の受け渡しなどの他の実装では、どのユーザーがコマンド待ち同じ定数>を生成しません。

私は本当にこれがSEに頼る前に起きてた理由のためにどこでも私ができるオンラインに見えました私が思うような単純な頭痛の種になります。

+0

まず、 'cat'への呼び出しがありません。ファイル名だけでは何もしません。次に、' cat'を使用しないでください.3番目に、あなたのコマンドに左引用符を使用しました。通常の一重引用符。それは動作するものとほとんど同じコマンドです。 –

+0

実際、あなたは[cat'の無用な使用](https://stackoverflow.com/questions/11710552/useless-use-of-cat)を避けたいと考えています。 – tripleee

+0

同じファイルをパイプラインで読み書きすることは安全ではありません。パイプライン内のすべてのコマンドは同時に実行されるので、 'cat'は' tail'が空白になる前に元の内容の読み込みを完了することもできないこともあります。 'jq'を一時ファイルに出力し、エラーをチェックしてください(' jq'が正常に終了しましたか?)、そしてエラーがなければ、元のファイルを一時ファイルに置き換えてください。 –

答えて

1

@GordonDavissonが指摘しているように、01入力ファイルを上書きするためのは(よく知られています。 jq FAQ)のレシピが作成されました。これについてさらに詳細とその他のオプションについては

cp -p config.json config.json.bak && jq ... config.json | sponge config.json 

、検索:あなたは絶対に積極的に無条件でファイルを上書きしたい場合は、

jq ... config.json | sponge config.json 

以上の安全のように、spongeを使用して検討する必要がありますFAQの 'スポンジ'について

+0

この返答いただきありがとうございます:) spongeは非常に便利ですが、値を変更するためにいくつかのjqパイプラインの後にファイルが完全に消去されることがあるようです。私がやろうとしているのは、そのファイル内のいくつかのキーの値を変更することです。必ずしも上書きする必要はありません。値を変更して新しいファイルにするより良い、多分より安全な方法はありますか? –

+0

別のファイルに書き込んで、すべての置換が完了したら、元のファイルを置き換えて置き換えます。複数のプロセスを実行して複数の置換を実行することは悪い考えですが、データの損失は悪くないだけでなく、非効率的で醜い悪いことです。 – tripleee

関連する問題