从每一行中删除一部分 JSON 数据的命令?

Guf*_*oru 5 string text-processing json

我有test.json不同长度的行的文件。一些虚构的例子:

{ a: 123, b: sd, c: x45, d: 1, e: '' }
{ a: 5, b: bfgg, c: x4c, d: 31, e: '' }
Run Code Online (Sandbox Code Playgroud)

我想在d- 部分之后剪切整个子字符串并返回每一行:

{ a: 123, b: sd, c: x45 }
{ a: 5, b: bfgg, c: x4c }
Run Code Online (Sandbox Code Playgroud)

我在这里发现一个类似的问题,并试图使我的问题适应它:

echo test.json |  sed 's/. d:/' > newtest.json
Run Code Online (Sandbox Code Playgroud)

我需要为整个文件做这件事,而不仅仅是一行。

Fre*_*Dog 6

如果您在命令行上进行了大量转换 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": "" }
Run Code Online (Sandbox Code Playgroud)

那么这个 jq 命令就会满足你的要求

 jq -c '{a,b,c}' test.json

{"a":123,"b":"sd","c":"x45"}
{"a":5,"b":"bfgg","c":"x4c"}
Run Code Online (Sandbox Code Playgroud)


rus*_*ush 4

sed '/d:/s/, d:[^}]*/ /' test.json
Run Code Online (Sandbox Code Playgroud)

它将遍历整个文件并删除每一行的d:所有, d:.*部分直到}符号(}符号将保留在该行上)。