【问题标题】:Ubuntu 16 sed not working with parenthesisUbuntu 16 sed 不能使用括号
【发布时间】:2020-12-29 02:12:04
【问题描述】:

哦,我无法通过这个 SED 正则表达式。第一条记录中的这一行 "entrytimestamp" : ISODate("2020-09-09T16:07:34.526Z") 也应进行转换,但由于右括号后没有逗号,因此它是不是。只是我想删除 "ISODate(" 和右括号 ")"。但它是否是最后一个元素并不重要。我已经两次/三次检查了正则表达式,但我遗漏了一些东西。有人知道吗?

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"),
                "USER" : null,
                "entrytimestamp" : ISODate("2020-09-09T16:07:34.526Z")
        },
        {
                "_id" : ObjectId("5f590118c205630016dcafb4"),
                "entrytimestamp" : "2020-09-09T16:21:44.346Z",
                "USER" : null
        }
]

【问题讨论】:

    标签: regex ubuntu sed


    【解决方案1】:

    你可以使用这个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" *: *)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/' file
    • 好的,我明白了,这与加号与星号的贪婪有关。我正在 gnu sed 网站上阅读,但确实可以看到“为什么”。但是感谢您为我指明方向。
    【解决方案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.

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 2019-06-03
      • 2012-08-25
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2014-06-14
      • 2022-10-19
      • 2018-10-18
      相关资源
      最近更新 更多