【发布时间】:2019-04-11 13:34:11
【问题描述】:
我想从 json 中删除尾随逗号,
{
"key1": "value1",
"object": {
"key2": "value2", // <- remove comma
},
"key3": "value3", // <- remove comma
}
我想出了,
tr -d '\n' | \
sed -E 's:,(\s*}):\1:g' | \
jq .
它有效,但我想在sed 中完全得到它。
我想出了,
sed -E '/,\s*$/ { N; s:,\s*(\n\s*},?):\1: }'
适用于上述输入但失败
{
"key1": "value1",
"object": {
"key2": "value2",
},
"key3": "value3",
"key4": "value4", // <- remove comma
}
N 读取下一行并从下一行重新开始。
// output sed -E '/,\s*$/ { N;l }' using l/look command
{
"key1": "value1",\n "object": {$
"key1": "value1",
"object": {
"key2": "value2",\n },$
"key2": "value2",
},
"key3": "value3",\n "key4": "value4",$
"key3": "value3",
"key4": "value4",
}
更新:
添加另一个示例进行测试:
{
"key1": "value1",
"object1": {
"object2": {
"key2": "value2"
},
},
"key3": "value3",
}
更新:
这对我扔给它的任何东西都有效。
sed -E -n 'H; x; s:,(\s*\n\s*}):\1:; P; ${x; p}' | \
sed '1 d'
解释:
sed -E -n 'H; x; P; ${x; p}'
-n 'H; x' 将每一行附加到模式空间中的下一行(除了最后一行,它只是用${x; p} 打印)
和
s:,(\s*\n\s*}):\1:;
删除模式空间中的尾随逗号。
【问题讨论】:
-
你能改掉生成无效 JSON 的东西吗?因为这并不是你要用
sed稳健地解决的那种问题。 -
几乎所有语言都有 JSON 库。如果您收到这样的无效 JSON,则肯定表明创建者使用了自己的代码而不是使用适当的库,并且他们不知道自己在做什么。告诉他们修复它。
-
因为如果他们连逗号都搞不懂,他们可能还会遇到其他问题,比如转义字符串中的特殊字符。试图解决他们所有的错误,你会让自己发疯。
-
你所做的任何事情都可能会因为
key: "foo,}"而失败,它会删除字符串中的逗号。