各行から JSON データの一部を削除するコマンドはありますか?

各行から JSON データの一部を削除するコマンドはありますか?

行の長さが異なるファイルがありますtest.json。架空の例:

{ a: 123, b: sd, c: x45, d: 1, e: '' }
{ a: 5, b: bfgg, c: x4c, d: 31, e: '' }

- 部分の後の部分文字列全体を切り取りd、各行だけを戻したい:

{ a: 123, b: sd, c: x45 }
{ a: 5, b: bfgg, c: x4c }

私は見つけたここ同様の質問があり、自分の問題をそれに当てはめようとしました:

echo test.json |  sed 's/. d:/' > newtest.json

1 行だけでなく、ファイル全体に対してこれを実行する必要があります。

答え1

コマンドラインで json の変換を頻繁に行う場合は、jq ツールを入手して使用方法を学習する価値が十分にあります。

http://stedolan.github.io/jq/

上記の回答は、実際に JSON を解析せずに最小限の変換を実行できることを示していますが、最終的には、正規表現を使用してバグのある JSON パーサーを再発明するか、選択した言語のネイティブ JSON パーサーの使用に戻ることになります。

jq は高速で使いやすく、ツールボックスに入れておいて非常に便利なツールです。

BWT、テストデータは無効なJSONなので、上記の解決策は複雑になります。

{ "a":123 , "b": "sd", "c": "x45", "d": 1, "e": "" }
{ "a":5 , "b": "bfgg", "c": "x4c", "d": 31, "e": "" }

このjqコマンドはあなたが望むことを実行します

 jq -c '{a,b,c}' test.json

{"a":123,"b":"sd","c":"x45"}
{"a":5,"b":"bfgg","c":"x4c"}

答え2

sed '/d:/s/, d:[^}]*/ /' test.json

ファイル全体を調べて、各行から記号までのd:すべての, d:.*部分を削除します}(}記号は行に残ります)。

答え3

@Rush の回答 を使用するのがsedおそらくこの問題を解決する最善の方法ですが、以下を使用してawkも実行できます:

$ awk -F ', d.* ' '{print $1, $2}' file.txt 
{ a: 123, b: sd, c: x45 }
{ a: 5, b: bfgg, c: x4c }

上記では、 を使用しawkて のデータを分割します, d.*。これにより、 と の 2 つのデータ フィールドが生成され、$1そこ$2には AWK による文字列の分割の結果のデータが含まれます。

答え4

次のようなオブジェクトのセットを含む有効なJSONファイルがあると仮定します。

{"a":123,"b":"sd","c":"x45","d":1,"e":"''"}
{"a":5,"b":"bfgg","c":"x4c","d":31,"e":"''"}

または同等のもの

{
  "a": 123,
  "b": "sd",
  "c": "x45",
  "d": 1,
  "e": "''"
}
{
  "a": 5,
  "b": "bfgg",
  "c": "x4c",
  "d": 31,
  "e": "''"
}

各オブジェクトからキーdとキーを削除したいとします。e

を使用してjq、一度に 1 つのキーを削除します。

jq -c 'del(.d) | del(.e)' file.json

両方のキーを一度に削除する:

jq -c 'del(.d, .e)' file.json

どちらの場合も結果は

{"a":123,"b":"sd","c":"x45"}
{"a":5,"b":"bfgg","c":"x4c"}

実際のキーを名前で指定せずにこれを行う 3 番目の方法は、 を使用してオブジェクトを「エントリ」のリストに変換しto_entries、最後の 2 つのエントリを削除して、リストを変更されたオブジェクトに戻すことです。

jq -c 'to_entries | del(.[-2:]) | from_entries' file.json

これは質問のテキストが提案するものに最も似ており、結果はオブジェクト内のキーの順序によって異なります。

関連情報