如何使用 SED 转换 JSON 中的数据格式



我有一个巨大的NDJSON文件,其中有一个字段是"createDate":"01/02/2018"。它是dd/mm/yyyy格式,我需要将其转换为yyyy-mm-dd格式。

我可以使用以下命令在一个小输入上使用sed来执行此操作:

echo 28/02/2018 | sed 's,([0-9][0-9])/([0-1][0-9])/([1-2][0-9][0-9][0-9]),3-2-1,'

但是,我找不到必须在 JSON 文件中执行此操作的解决方案,其中此值位于名为"createDate"的键下。

示例 JSON 对象如下所示:

{
"pushNotificationEnabled": "true",
"createDate": "11/08/2018",
"email": null,
"photoUrl": null
}

任何帮助将不胜感激。

您的命令适用于您的示例 JSON 对象!您可能希望将其操作限制为createDate字段:

sed '/"createDate":/s,([0-9][0-9])/([0-1][0-9])/([1-2][0-9][0-9][0-9]),3-2-1,' input.json

这只会影响包含"createDate":标记的行:

==> input.json <==
{
"pushNotificationEnabled": "true",
"createDate": "11/08/2018",
"modifyDate": "31/08/2018",
"email": null,
"photoUrl": null
}
$ sed '/"createDate":/s,([0-9][0-9])/([0-1][0-9])/([1-2][0-9][0-9][0-9]),3-2-1,' input.json
{
"pushNotificationEnabled": "true",
"createDate": "2018-08-11",
"modifyDate": "31/08/2018",
"email": null,
"photoUrl": null
}

假设 NDJSON 文件中的每个对象都能舒适地放入内存中,无论文件本身有多大,按照以下行调用 jq 都应该可以完成这项工作,因为 jq 一次只会读取一个 JSON 实体:

jq '.createDate |=
sub("^(?<m>[0-9]*)/(?<d>[0-9]*)/(?<y>[0-9]*)"; "(.y)-(.m)-(.d)")' input.json

尽管 jq 对于该任务的效率可能略低于 sed,但它确实可以理解 JSON。

最新更新