如何使用 sed 将 },{"Foo" 更改为 }\n{"Foo"?

如何使用 sed 将 },{"Foo" 更改为 }\n{"Foo"?

我有一个 55MB 的 JSON 文件,其中包含大量由},{.我想每行有一个对象并去掉逗号。一方面,我希望能够使用编辑器查看该文件,而大多数编辑器不喜欢 55MB 行的文件。我使用了以下sed命令,但它写出了一个零长度的文件。我怎样才能达到我想要的结果?

cat INPUT | sed -n 's/},{"Foo"/}\n{"Foo"/g' > OUTPUT

答案1

sed 的标志-n意味着安静。那么自动打印行就被禁用了,你必须用命令显式地打印一行p

只需使用您的命令,末尾不带-n或带:p

sed 's/},{"Foo"/}\n{"Foo"/g' file >output

或者:

sed -n 's/},{"Foo"/}\n{"Foo"/gp' file >output

答案2

由于对象是用逗号分隔的,我假设它们在一个数组中。

如果它们位于一个数组中,并且该数组是顶级数组,如

[{"Foo":"first"},{"Foo":"second"},{"Foo":"third"}]

...那么你可以使用JSON 处理器jq将外部数组扩展为一组单独的对象,如下所示:

jq -c '.[]' file

根据我之前的示例输入,这将产生以下一组 JSON 对象:

{"Foo":"first"}
{"Foo":"second"}
{"Foo":"third"}

由于这会改变文档的结构,因此您可以使用类似的内容jtc,另一个 JSON 处理器,其功能允许您漂亮地打印文档,就像jq默认情况下一样,但以紧凑的形式呈现每个结构的最低级别:

$ jtc -tc file
[
   { "Foo": "first" },
   { "Foo": "second" },
   { "Foo": "third" }
]

由于您似乎主要想从视觉上探索该文档,因此您可能也对jless公用事业,这是一种“JSON 浏览器”。它将显示文档的结构以及(交互式)可折叠子结构:

▽ [{…}, {…}, {…}]
  ▽ [0]: {Foo: "first"}
      Foo: "first"
  ▽ [1]: {Foo: "second"}
      Foo: "second"
  ▽ [2]: {Foo: "third"}
      Foo: "third"

相关内容