
我有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 工具並學習使用它。
雖然上面的答案表明您可以在不實際解析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
這最像問題文字所提出的內容,結果取決於物件中鍵的順序。