【问题标题】:Adding comma between objects in json file在json文件中的对象之间添加逗号
【发布时间】:2019-01-26 00:08:09
【问题描述】:

我有一个很大的 json 表,我需要在上面的 json 对象之间添加 comm。我无法手动执行此操作。文件结构如下:

[{"host"
}
{"host"
}
{"host"
}
]

我需要使用sed 将其修改为:

[{"host"
},
{"host"
},
{"host"
}
]

我执行了以下命令。我没有收到任何错误。但文件中没有任何变化:

sed -i 's/}{"host"/},{"host"/g' result.json 

我怀疑我应该考虑 }{ 用换行符分隔?我尝试在命令中添加\n,但也没有成功。

【问题讨论】:

标签: json linux parsing search sed


【解决方案1】:

使用 GNU awk 进行多字符 RS:

$ awk -v RS='^$' -v ORS= '{gsub(/}\n{/,"},\n{")}1' file
[{"host"
},
{"host"
},
{"host"
}
]

或者如果您愿意:

$ awk -v RS='}\n{' '{ORS=(RT ? "},\n{" : "")} 1' file
[{"host"
},
{"host"
},
{"host"
}
]

或使用 GNU sed 获取 -z 并将 \n 识别为换行符:

$ sed -z 's/}\n{/},\n{/g' file
[{"host"
},
{"host"
},
{"host"
}
]

【讨论】:

  • sed -z 's/}\n{/},\n{/g' file 在 moc 示例中工作。但是当我尝试真正的文件 .json 它不起作用。 GNU 是什么意思?我使用 Ubuntu 18.04
  • GNU - gnu.org。我希望你可以在 Ubuntu 上拥有 GNU 工具(例如 GNU sed、GNU awk、GNU sort 等),就像你可以在所有其他类 UNIX 平台上一样。运行sed --version,输出会告诉您它是否是 GNU sed - 该脚本也可能适用于其他 sed,我只知道它适用于 GNU sed,但不适用于所有 sed。如果脚本适用于您提供的示例,但不适用于您的真实数据,则这意味着脚本按预期工作,但您的示例不代表您的真实数据。
  • 我将真实文件的前两条记录复制到一个小文件中。我运行命令并且它有效。但是当我在真实数据文件(它是一个json文件)中运行它时,没有添加逗号。我不能发布真正的文件它太长了。我将前两条记录复制到一个单独的文件中,它可以工作。可能是什么问题?
  • 可以是任何东西。执行通常的分而治之的调试步骤 (WHILE (command is failing) DO cut the file in half, choose a half for the next iteration DONE) 以找到该命令不起作用的实际输入文件的一小部分,然后考虑与它起作用的部分有何不同.
【解决方案2】:

与其尝试在换行符之前插入逗号,您可以轻松地在之后插入它:

sed 's/^{"host"/,&/'

结果看起来有点奇怪,但符合标准的 JSON 阅读器不应该在意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2020-09-25
    • 2019-08-28
    • 2018-04-18
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多