什么是`regex grep`,应用于文件,Golang中的等价物?

问题描述 投票:-2回答:1

问题

我现在正在为多个文件运行一个正则表达式grep以获取所有TODO,但是在命令完成之前需要几分钟:

real    5m8.073s
user    0m35.593s
sys     4m17.608s

目标

目的是立即获得TODO的数量。

尝试

根据我在互联网上发现的内容,我认为Golang是一个很好的候选人,我创建了以下代码。

func check_for_todo(path string) {
    text := "//\\sTODO\\s\\d"

    b, err := ioutil.ReadFile(path)
    if err != nil {
        panic(err)
    }
    s := string(b)

    // containsTodo := strings.Contains(s, text)
    containsTodo, _ := regexp.MatchString(text, s)

    if containsTodo {
        numberOfTodos++
        fmt.Println("This file contains a todo:", path)
    }
}

结果

与bash相比,查询现在快两倍。

real    2m17.050s
user    0m0.015s
sys     0m0.015s

讨论

我觉得这个代码可以优化,目前是狡猾的。我现在正在寻找渠道和goroutines。

go
1个回答
1
投票

您可能想查看the silver searcher(a.k.a ag)所做的优化。它进行了许多优化,以便进行极快的代码搜索。

另一种选择可能是预构建索引,因此搜索甚至比实时执行的任何操作都快。在ag自述文件中,引用了exuberant ctags来执行此操作,并且可以用于极大的代码库。

© www.soinside.com 2019 - 2024. All rights reserved.