私は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
sponge
GNU(ソフトウェアパッケージの一部)などのツールを使用して、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.json
file.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
今私が必要なことをしてください。