在Golang中查找模式的字节偏移

时间:2019-06-27 21:02:11

标签: go

我们可以从文件中找到一个模式的字节偏移量 “ grep -ob模式文件名”; 但是,grep是不安全的utf8。 如何在Go中找到模式的字节偏移?该文件是进程日志,可以以TB为单位。

这就是我想要进入Go的内容:

$ cat fname
hello world
findme
hello 世界
findme again

...

$ grep -ob findme fname

12:findme
32:findme

1 个答案:

答案 0 :(得分:1)

FindAllStringIndex(s string, n int)返回表达式的所有连续匹配的字节开始/结束索引(即切片):

DestroyMenu()

输出:

  

[[12 18] [32 38]]

注意:我是在Microsoft Windows上执行此操作的,但是以UNIX格式(换行)保存了文件;如果输入文件以Windows格式保存(回车和换行),则字节偏移量将分别增加到13和35。

更新:对于大文件,请使用bufio.Scanner;例如:

package main

import "fmt"
import "io/ioutil"
import "regexp"

func main() {
    fname := "C:\\Users\\UserName\\go\\src\\so56798431\\fname"
    b, err := ioutil.ReadFile(fname)
    if err != nil {
      panic(err)
    }

    re, err := regexp.Compile("findme")
    if err != nil {
      // handle error
    }
    fmt.Println(re.FindAllStringIndex(string(b), -1))
}

输出:

  

12

     

32