中途半端なJSONファイルをsedコマンドで整形する

eyecatching_incomplete-json-sed-format プログラミング
この記事は約2分で読めます。
中途半端なフォーマットのJSONファイルをsedコマンドで整形した。

対象JSONファイル

上記が対象のJSONファイルである。このJSONファイルの問題点と解決方法は下記。

  • オブジェクトがただ羅列されている
    • オブジェクトを配列にする(ファイル先頭に[を、ファイル末尾に]を追加し、各オブジェクトの末尾にカンマと追加する。ただし、最後のオブジェクトの末尾にカンマはつけない)
  • 各キーやバリューの引用符がシングルクォーテーションである
    • ダブルクォーテーションに置換する
  • Trueはtrue、Falseはfalse、Noneはnullが正しい
    • 正しい値に置換する

JSONは配列の最後のオブジェクトにカンマをつけるとエラーになる。。余談だが、Pythonはあっても問題ないのでPythonさんはホントに使いやすい。

sedコマンド

やっていることはコメント通り。シングルクォーテーションをダブルクォーテーションに置換するところは、sed -i "s/'/\"/g" ${file}だと要素中にシングルクォーテーションが含まれている場合ダブルクォーテーションに置換してしまうため、そうならないようにしている(とは言え、要素中に置換前の文字列が含まれている場合は置換してしまう)。

全sedコマンドを実行したあとのJSONファイルは上記のようになる。

その他

Linuxでやるので、改行コードはLFにしないと正しく動かない。最初、改行コードをCR+LFで保存してある状態で始めて、結果がおかしくなった。

sedコマンドは-iオプションで直接ファイルを編集しているため、バックアップはとっておく必要あり。

sedコマンドを一気に実行すると、sed: cannot rename ./sediHCnlW: Permission deniedのようなエラーが出る。前のsedコマンドが完了してない状態で次のsedコマンドを実行するとなるっぽい。前のsedコマンドが完了したら次という風に実装したかったがうまくいかなかった。。各sedコマンドの下にsleep 1をいれたらうまくいったがイケてない。。

あと、これだったらうまくいった。が、、もっとうまく書く方法はないものか。。

タイトルとURLをコピーしました