什么是“ regex grep”,应用于文件,相当于Golang?

时间:2018-09-09 16:29:06

标签: go

问题

我现在正在对多个文件运行一个正则表达式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

讨论

我觉得该代码可以进行优化,目前是不可靠的。我现在正在研究通道和goroutine。

1 个答案:

答案 0 :(得分:1)

您可能想查看the silver searcher(也称为ag)所做的优化。为了进行极其快速的代码搜索,它进行了许多优化。

另一种选择可能是预先构建索引,因此搜索比实时执行的任何搜索都快。在ag自述文件中,引用了exuberant ctags,它可以用于非常大的代码库。