gpt4 book ai didi

linux - 提取模式的最快方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:23 25 4
gpt4 key购买 nike

从如下输入中提取感兴趣的子串的最快方法是什么?

MsgTrace(65/26)noop:user=xxx=INBOX:cmd=534
ImapFetchComplete(56/39)user=xxxxxxxxxx

所需的输出(即,在本例中,以 : 结尾的字符串位于 MsgTrace(65/26) 之后):

noop

我尝试了以下方法,但没有成功:

egrep -i "[a-zA-Z]+\(.*\)[a-z]+:"

最佳答案

grep 在给定输入行上找到匹配项时,默认返回整行

虽然选项 -o 将输出限制为正则表达式匹配的行的那一部分,但这在这种情况下仍然不够,因为你想要一个 substring那场比赛。

但是,由于您使用的是 Linux,您可以使用 GNU grep-P 选项(用于支持 PCREs,Perl 兼容的正则表达式) ,它允许通过 \K(删除目前匹配的所有内容)和 (?=...) 等功能提取子匹配 (对匹配没有贡献的前瞻断言):

$ grep -Po  "[a-zA-Z]\(.*\)\K[a-z]+(?=:)" <<'EOF'
MsgTrace(65/26)noop:user=xxx=INBOX:cmd=534
ImapFetchComplete(56/39)user=xxxxxxxxxx
EOF
noop # output

可选背景信息:

Ed Morton指出(在一条已删除的评论中)GNU grepman 页面仍然调用 -P 选项“高度实验性”,这可能“警告未实现的功能”,但该选项已经存在多年,实际上我还没有看到警告或性能问题 - YMMV。

在手头的案例中,上述命令甚至优于 sedawk 解决方案 - 参见 NeronLeVelu's helpful performance comparison .

interesting article Ed points to discuss a potential performance problem can surface with regex engines such as used by grep -P (via the PCRE library), Perl 本身, 以及许多其他广泛使用的(和成熟的)正则表达式引擎,例如 Python、Ruby 和 PHP:

  • 简而言之:这些引擎采用的递归回溯算法可能会导致“病态”正则表达式的严重性能下降,这些正则表达式将带有可变长度量词的长子表达式序列串在一起,例如(的较长版本)a ?a?a?a?aaaa 匹配 aaaa
  • 文章认为,仅当正则表达式包含反向引用时才真正需要回溯,如果不存在反向引用,则应采用不同的、更快的算法。

关于linux - 提取模式的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41733155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com