Text-Processing

從每一行中刪除一部分 JSON 數據的命令?

  • July 14, 2021

我有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

我需要為整個文件執行此操作,而不僅僅是一行。

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

它將遍歷整個文件並在每一行上刪除d:所有, d:.*部分,直到}符號(}符號將留在行上)。

如果您在命令行上轉換 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"}

引用自:https://unix.stackexchange.com/questions/168416