次のファイルがあるとします。
{
"fruit": "Apple",
}
次の行に「}」が含まれている場合にのみ、行末のカンマを削除したいと思います。したがって、出力は次のようになります。
{
"fruit": "Apple"
}
ただし、ファイルが以下のような場合。私は変更をしたくありません。,
s 後に来ないから}
{
"fruit": "Apple",
"size": "Large",
"color": "Red"
}
sedがあれば何でもいいでしょう。
答え1
この問題が発生する理由は、JSON形式がキーやデータに表示されないスペースを気にしないためです。だから、
{ "key": "data" }
同じですか?
{ "key":
"data"
}
JSONファイルが「破損する」可能性を追加する場合
{ "key":
"data", }
データを解析するときにJSON形式の制約を軽減する方法を知っているJSONパーサー以外のものを使用して文書を正しく解析することは非常に困難です。
PerlJSON
モジュールはこれを行い、結果をきれいに印刷することもできます。
$ cat file.json
{
"fruit": "Apple",
}
$ perl -MJSON -e '@text=(<>);print to_json(from_json("@text", {relaxed=>1}), {pretty=>1})' file.json
{
"fruit" : "Apple"
}
ここでは、全文文書を配列として読み込みます@text
。その後、解析を軽減しながらそれをデコードします(これにより、JSONドキュメントには前にカンマがあり、}
コメント]
も含めることができます#
)。次に、結果のPerlデータ構造をすぐにJSONにエンコードして印刷します。
他の例:
$ cat file.json
{
"fruit": "Apple", # a comment
"stuff": [1, 2, 3,],
}
$ perl -MJSON -e '@text=(<>);print to_json(from_json("@text", {relaxed=>1}), {pretty=>1})' file.json
{
"fruit" : "Apple",
"stuff" : [
1,
2,
3
]
}
きれいな印刷はありません。
$ perl -MJSON -e '@text=(<>);print to_json(from_json("@text", {relaxed=>1}))' file.json
{"fruit":"Apple","stuff":[1,2,3]}
(出力の末尾に改行文字はありません)
非常に大きな文書では、モジュールの増分解析機能を使用し、適切な変換スクリプトを作成する必要があるかもしれません。
答え2
sed -i.bak ':begin;$!N;s/,\n}/\n}/g;tbegin;P;D' FILE
sed -i.bak
= 元のファイルのバックアップを作成し、そのファイルに変更を適用します。
':begin;$!N;s/,\n}/\n}/g;tbegin;P;D'
=すべて、続いて新しい行と}。削除する、前の行に
FILE
=変更したいファイル