Ubuntu 16 sed无法使用括号

问题描述

哦,我无法超越这个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

This is how the expression works

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...