各行から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.*。これは、AWKが文字列を分割して生成されたデータを$1含む2つのデータフィールドを生成します。$2

答え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

一度に2つのキーを削除します。

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

これらのうちの1つの結果は次のとおりです。

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

3番目のアプローチ(実際のキーを名前とは言いません)は、オブジェクトを「アイテム」リストに変換し、最後の2つのアイテムを削除してリストを変更されto_entriesたオブジェクトに変換することです。

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

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

関連情報