私のファイルを美しくするためにjqを使用できますか?

私のファイルを美しくするためにjqを使用できますか?

私はjqを使ってjsonファイルを読み込み、ファイルのきれいなバージョンを書くシェルスクリプトを書いています。

cat input.json | jq . > pretty.json
cp pretty.json ./input.json
rm pretty.json

2行と3行が必要な理由は次のとおりです。

cat input.json | jq . > input.json

ファイルを空白のままにすると、一時ファイルを使用せずにshell / jqを使用してファイルを美しくする方法はありますか?

答え1

jqいいえ、ファイルを処理して結果を生ファイルに出力することはできません。

次のように一時ファイルを使用できます。

cp   file.json      file.json.tmp &&
jq . file.json.tmp >file.json     &&
rm   file.json.tmp

この一連の操作は、元のファイルのメタデータも保存します。各ステップは、前のステップが正常に完了したかどうかに依存するため、たとえば、&&実行が失敗しても文書は失われません。jq

spongeGNU(ソフトウェアパッケージの一部)などのツールを使用して、moreutils一時ファイルを処理する手作業を非表示にできます。

jq . file.json | sponge file.json

これはまだ背後に一時ファイルを使用していることに注意してください。

2つのバリエーションのうち、jqパーティションが突然いっぱいになったり、正しく実行されなかった場合(入力文書の可用性またはエラーのため)、3つのコマンドの最初のセットだけがデータの損失を防ぐことができます。

答え2

json-beautify-inplace () {
  temp=$(mktemp)
  printf 'input = %s\n' "$1"
  printf 'temp  = %s\n' "$temp"
  cp -- "$1" "$temp"
  jq . "$temp" > "$1"
}

json-uglify-inplace () {
  temp=$(mktemp)
  printf 'input = %s\n' "$1"
  printf 'temp  = %s\n' "$temp"
  cp -- "$1" "$temp"
  jq -r tostring "$temp" > "$1"
}

答え3

file.json一時ファイルを使用せずにファイルをコピーに変更して美しくすることは実際に可能ですjqが、これは少しハックです。

( exec < file.json; rm file.json; jq . > file.json )

このコマンドラインの「魔法」の説明は次のとおりです。

  • exec < file.jsonfile.jsonシェル全体の標準入力としてソースファイルを開くため、後続のコマンドはこのファイルを標準入力として使用します。
  • rm file.json着信コマンドでコンテンツを上書きせずにファイルが開いている間にコンテンツを引き続き使用できるように、ファイルのリンクを解除します。
  • jq . > file.json標準入力から新しいfile.jsonファイルでJSONを美しくします。
  • コマンドライン全体はサブシェルで実行されるかっこで囲まれ、削除されたファイルは閉じられ、標準入力は最後に復元されます。

少し簡潔な方法で書くことができます。

( rm file.json; jq . > file.json ) < file.json

とにかく、この作業ではなく一時ファイルを使用することをお勧めします!

答え4

jq私はそうすることができなかったので、.bashrcこのシェル関数を and で定義しました.zshrc

prettify() {
    local temp_file
    temp_file=$(mktemp) &&
      jq . < "$1" > "$temp_file" &&
      mv -- "$temp_file" "$1"
}

prettify foo.json今私が必要なことをしてください。

関連情報