【问题标题】:prevent sed from printing non-captured group [duplicate]防止sed打印未捕获的组[重复]
【发布时间】:2021-06-02 19:31:25
【问题描述】:

我正在使用 sed 仅捕获和打印 12 点之前的特定时间戳(即,第一个数字为 0,例如小时为 09)

sed  -E 's/^.*\[(.* 0.*)\].*/\1/g'

但是,它也会打印未捕获任何组的行。如何避免打印那些?

以下是上述命令的输出。在正则表达式匹配的地方,只打印捕获的组,在不匹配的地方,打印原始字符串。如果正则表达式不匹配,我想避免打印字符串。

2021/03/01 09:11:14
Accessed ([2021/03/01 12:32:36])
Accessed ([2021/03/01 16:48:29])
Accessed ([2021/03/01 19:40:03])
2021/03/02 08:53:27
Accessed ([2021/03/02 11:03:23])
Accessed ([2021/03/02 11:04:08])
Accessed ([2021/03/02 16:36:48])
Accessed ([2021/03/02 19:35:31])
2021/03/03 08:38:10

【问题讨论】:

  • @VishalSingh 但它的 0 跟在空格后面。
  • 上述测试的预期输出是什么?
  • 试试:sed -nE 's/^.*\[(.* 0.*)\].*/\1/p' file
  • @anubhava 如果您可以发布您的解决方案作为答案,那么我可以接受。
  • 我不同意这个欺骗帖子。可能还有其他更合适的骗子我找不到,但这个看起来不像是正确的骗子。

标签: regex sed


【解决方案1】:

将我的评论转换为答案,以便将来的访问者轻松找到解决方案。

您可以使用此sed 来禁用不匹配行的正常打印:

sed -nE 's/^.*\[(.* 0.*)\].*/\1/p' file

另外请理解,.* 本质上是贪婪的,并且由于大量回溯,这种模式对于大文件往往会变慢。

我建议将此正则表达式与否定字符类一起使用:

sed -nE 's/^[^[]*\[([^ ]* 0[^]]*)\].*/\1/p' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多