V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Fu4ng
V2EX  ›  程序员

一个 grep 最小匹配的问题

  •  
  •   Fu4ng · 2021-07-05 17:55:29 +08:00 · 1789 次点击
    这是一个创建于 1240 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我获得符合模式的最小匹配项

    比如:
    echo "axxabcaca" | egrep -oe "a.*?c.*?a"

    我想要的:
    aca

    但是:
    axxabca

    有什么办法呢?

    环境:
    MacOS
    谷歌了下,说是使用-P 参数可以,但是 MAC 的 grep 没有-P 参数
    9 条回复    2021-07-06 23:06:26 +08:00
    raaaaaar
        1
    raaaaaar  
       2021-07-05 18:00:20 +08:00 via Android
    分组捕获吗?我上午才遇到这个问题,P 选项是扩展语法才支持的,可以试下 sed 或者 cut,直接搜 grep 分组捕获就有答案
    Fu4ng
        2
    Fu4ng  
    OP
       2021-07-05 18:13:48 +08:00
    @raaaaaar 好像不能解决啊。。
    AoEiuV020
        3
    AoEiuV020  
       2021-07-05 18:17:22 +08:00
    做不到吧感觉,正则都是从左往右匹配,越前面的越先开始匹配,这个优先级是高于贪婪懒惰的,第一个 a 一定是最优先参与匹配的,不管后面有没有 a 满足条件,
    Fu4ng
        4
    Fu4ng  
    OP
       2021-07-05 19:36:02 +08:00
    echo "axxabcaca" | awk '/a.*?c.*?a/{ print $0 }

    也不行。
    junyee
        5
    junyee  
       2021-07-05 20:10:45 +08:00
    只能 grep -P 了吧。


    ```
    echo "axxabcaca" | grep -oe "a[^a]*c[^a]*a"
    ```
    lululau
        6
    lululau  
       2021-07-05 20:19:27 +08:00
    brew install grep 或者 brew install the_silver_searcher
    no1xsyzy
        7
    no1xsyzy  
       2021-07-06 11:06:58 +08:00
    正则是最左开始扫描, -P 应该也是解决不了的
    你要全局最短应当是反复去掉第一个字符重新扫描一遍,在所有的结果中找到最短的。更优化是每次从上次命中的第一个字符的后一个字符开始重新扫描。
    RexG
        8
    RexG  
       2021-07-06 15:38:25 +08:00
    最先开始的匹配拥有最高的优先权 匹配规则优先级更高
    ooops
        9
    ooops  
       2021-07-06 23:06:26 +08:00 via iPhone
    你可以把所有匹配的拿出来在筛最短的啊 为什么非要正则一步拿出来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4575 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:05 · PVG 09:05 · LAX 17:05 · JFK 20:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.