问题描述
哦,我无法超越这个SED正则表达式。第一条记录中的这一行“ entrytimestamp”:ISODate(“ 2020-09-09T16:07:34.526Z”)也应进行转换,但由于在右括号后没有逗号,因此不。我只是想删除“ ISODate(” )和右括号“)” 。但是,是否最后一个元素并不重要。我已经检查过REGEX,但我错过了一些东西。有人有什么主意吗?
root@# cat inar.json
[
{
"_id" : ObjectId("5f58fdc632e4de001621c1ca"),"USER" : null,"entrytimestamp" : ISODate("2020-09-09T16:07:34.526Z")
},{
"_id" : ObjectId("5f590118c205630016dcafb4"),"entrytimestamp" : ISODate("2020-09-09T16:21:44.346Z"),"USER" : null
}
]
sed -E "s/(.+\"entrytimestamp\"\s:\s)ISODate\((\"[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{1,3}Z\")\)(.+)/\1\2\3/" inar.json
[
{
"_id" : ObjectId("5f58fdc632e4de001621c1ca"),"entrytimestamp" : "2020-09-09T16:21:44.346Z","USER" : null
}
]
解决方法
您可以使用此sed
:
sed -E 's/("entrytimestamp" *: *)ISODate\(([^)]+)\)/\1\2/' file
[
{
"_id" : ObjectId("5f58fdc632e4de001621c1ca"),"USER" : null,"entrytimestamp" : "2020-09-09T16:07:34.526Z"
},{
"_id" : ObjectId("5f590118c205630016dcafb4"),"entrytimestamp" : "2020-09-09T16:21:44.346Z","USER" : null
}
]
命令详细信息
-
("entrytimestamp" *: *)
:将起始"entrytimestamp" :
部分与:
周围的可选空格进行匹配。在#1组中捕获该部分 -
ISODate\(
:匹配ISODate(
-
([^)]+)
:匹配非)
的任何字符的1+。在#2组中捕获这一部分 -
\)
:比赛结束)
-
/\1\2
:将回引#1和#2放回替换
您的正则表达式与您要匹配的第一行不匹配,因为最后一个(.+)
与至少一个或多个字符匹配。由于末尾只有)
,没有其他匹配项,因此模式失败。
使用(.*)
来匹配任何零个或多个字符:
sed -E "s/(.+\"entrytimestamp\"\s:\s)ISODate\((\"[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{1,3}Z\")\)(.*)/\1\2\3/" inar.json