我有一个部分损坏的 JSON 文件的数据库。出于某种原因编写它们的人在文件末尾包含了一个额外的逗号。这些文件有无数个,所以我需要修复它们。这是它的样子:
{
"foo": "bar",
"foo1": "bar1",
"foo2": "bar2",
}
所以我正在尝试使用 sed 命令来去掉逗号。现在,我已经 sed 's|',\n}'|'\n}'|' 但它没有修改文件。我究竟做错了什么?
OS X 附带的版本sed
不\n
视为换行符,而是视为转义的“n”(减少为常规的“n”)。由于您正在使用bash
,您可以尝试以下操作:
sed $'s|,}|\\\n|' file.txt
这$'...'
是一种特殊类型的引用bash
,允许对某些转义进行特殊处理。\\\n
是一个转义的反斜杠,后跟一个换行符,它bash
表示sed
为单个转义的换行符。
更新:在记住$
在搜索文本中使用而不是换行符后,我意识到您无法匹配下一行中后跟大括号的命令(或者至少,我不知道如何使用我的有限命令sed
)。
你可以试试 awk:
awk '{ if (/}/) sub(",$", "", last); if (last) print last; last=$0 } END { print last }'
这是一个也适用于 OSX 的 sed 解决方案:
sed -e ':a' -e 'N; $!ba' -e 's/,\(\n}\)/\1/' file.json
作为替代方案,您可以使用以下命令在 OSX 上安装 gnu-sed:
sudo brew install gnu-sed
然后运行:
gsed -e ':a; N; $!ba; s/,\(\n}\)/\1/' file.json