假设我有一个如下文件
{
"fruit": "Apple",
}
当且仅当下一行包含“}”时,我想删除行末尾的逗号。所以,输出将是:
{
"fruit": "Apple"
}
但是,如果文件如下所示。我不想做任何改变。由于,
s 后面没有跟}
{
"fruit": "Apple",
"size": "Large",
"color": "Red"
}
任何有 sed 的东西都会很棒。
答案1
造成这个问题的原因在于 JSON 格式不关心键或数据中不出现的空格。所以,
{ "key": "data" }
是相同的
{ "key":
"data"
}
如果添加“损坏”JSON 文件的可能性,例如
{ "key":
"data", }
除了知道如何在解析数据时放松 JSON 格式的限制的 JSON 解析器之外,使用其他任何东西来正确解析文档变得非常困难。
PerlJSON
模块可以做到这一点,并且还可以漂亮地打印结果:
$ cat file.json
{
"fruit": "Apple",
}
$ perl -MJSON -e '@text=(<>);print to_json(from_json("@text", {relaxed=>1}), {pretty=>1})' file.json
{
"fruit" : "Apple"
}
在这里,我们将整个文本文档读入数组中@text
。然后,我们在放松解析的同时对其进行解码(这使得 JSON 文档可以在前面有逗号}
,]
并且还可以包含#
注释)。然后我们立即将生成的 Perl 数据结构再次编码为 JSON 并打印它。
另一个例子:
$ cat file.json
{
"fruit": "Apple", # a comment
"stuff": [1, 2, 3,],
}
$ perl -MJSON -e '@text=(<>);print to_json(from_json("@text", {relaxed=>1}), {pretty=>1})' file.json
{
"fruit" : "Apple",
"stuff" : [
1,
2,
3
]
}
没有漂亮的印刷:
$ perl -MJSON -e '@text=(<>);print to_json(from_json("@text", {relaxed=>1}))' file.json
{"fruit":"Apple","stuff":[1,2,3]}
(输出末尾没有换行符)
对于非常大的文档,您可能需要使用模块的增量解析功能并编写适当的转换脚本。
答案2
sed -i.bak ':begin;$!N;s/,\n}/\n}/g;tbegin;P;D' FILE
sed -i.bak
= 创建原始文件的备份,然后将更改应用于该文件
':begin;$!N;s/,\n}/\n}/g;tbegin;P;D'
= 任何以,其次是新行和}。去除,在上一行
FILE
= 您要更改的文件