使用命令行工具删除尾随的 json 逗号

hIp*_*pPy 8 bash json sed

我想从 json 中删除尾随逗号,

{
  "key1": "value1",
  "object": {
    "key2": "value2", // <- remove comma
  },
  "key3": "value3", // <- remove comma
}
Run Code Online (Sandbox Code Playgroud)

我想出了,

tr -d '\n' | \
sed -E 's:,(\s*}):\1:g' | \
jq .
Run Code Online (Sandbox Code Playgroud)

它有效,但我想把它完全纳入sed.

我想出了,

sed -E '/,\s*$/ { N; s:,\s*(\n\s*},?):\1: }'
Run Code Online (Sandbox Code Playgroud)

这适用于上述输入,但失败

{
  "key1": "value1",
  "object": {
    "key2": "value2",
  },
  "key3": "value3",
  "key4": "value4", // <- remove comma
}
Run Code Online (Sandbox Code Playgroud)

asN读取下一行并从下一行开始。

// 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",
}
Run Code Online (Sandbox Code Playgroud)

更新:

添加另一个测试示例:

{
  "key1": "value1",
  "object1": {
    "object2": {
      "key2": "value2"
    },
  },
  "key3": "value3",
}
Run Code Online (Sandbox Code Playgroud)

更新:

无论我投入什么,这都有效。

sed -E -n 'H; x; s:,(\s*\n\s*}):\1:; P; ${x; p}' | \
    sed '1 d'
Run Code Online (Sandbox Code Playgroud)

解释:

sed -E -n 'H; x; P; ${x; p}'
Run Code Online (Sandbox Code Playgroud)

-n 'H; x'将每一行附加到模式空间中的下一行(除了最后一行,它只是用 打印${x; p}

s:,(\s*\n\s*}):\1:;
Run Code Online (Sandbox Code Playgroud)

删除模式空间中的尾随逗号。

pea*_*eak 7

由于输入似乎是 JSON 的某种扩展,因此您可以使用用于此类扩展的命令行工具。例如:

$ hjson -j < input.txt
Run Code Online (Sandbox Code Playgroud)

或者:

$ any-json --input-format=hjson input.txt
Run Code Online (Sandbox Code Playgroud)

两种情况下的输出

{
  "key1": "value1",
  "object": {
    "key2": "value2"
  },
  "key3": "value3"
}
Run Code Online (Sandbox Code Playgroud)

  • 好答案!另一方面,json 应该只支持尾随逗号!:) (3认同)