
行の長さが異なるファイルがあります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 ツールを入手して使用方法を学習する価値が十分にあります。
上記の回答は、実際に 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
これは質問のテキストが提案するものに最も似ており、結果はオブジェクト内のキーの順序によって異なります。