從每行刪除一部分 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

如果您在命令列上進行了大量轉換 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,一次刪除一個鍵:

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"}

第三種方法(不按名稱提及實際鍵)是使用 將物件轉換為「條目」列表to_entries,然後刪除最後兩個條目並將列表轉換回修改後的物件:

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

這最像問題文字所提出的內容,結果取決於物件中鍵的順序。

相關內容