web-dev-qa-db-ja.com

jqを使用してJSONのKey-Valueを変更する

特定の値を変更したいjsonがありますが、ターミナルは常に変更された値でjsonを表示しますが、実際には特定のファイルの値を変更しません。サンプルJSON:

{
   name: 'abcd',
   age: 30,
   address: 'abc'
}

ファイル自体のアドレスの値を変更したいのですが、今のところ変更できませんでした。私は使用してみました:

jq '.address = "abcde"' test.json

しかし、うまくいきませんでした。助言がありますか?

26
wolfsbane

AFAIK jqはインプレース編集をサポートしていないため、まず一時ファイルにリダイレクトしてから元のファイルを置き換えるか、moreutilsパッケージのspongeユーティリティを使用する必要があります。

jq '.address = "abcde"' test.json|sponge test.json

出力を変数e.t.cに保存するなど、「同じファイルにリダイレクトする」他の手法があります。 「Unix&Linux StackExchange」は、これについて詳しく知りたい場合に開始するのに適した場所です。

37
zeppelin

一時ファイルを使用します。インプレース編集を行うと主張するプログラムが実行していることです。

tmp=$(mktemp)
jq '.address = "abcde"' test.json > "$tmp" && mv "$tmp" test.json
47
chepner