我们可以通过以下方式从文件中找到模式的字节偏移量
“grep -ob 模式文件名”;
但是,grep
不是 utf8
安全的。
如何在 Go 中找到模式的字节偏移量?该文件是进程日志,可以是TB。
这就是我想在 Go 中得到的:
$ cat fname
hello world
findme
hello 世界
findme again
...
$ grep -ob findme fname
12:findme
32:findme
最佳答案
FindAllStringIndex(s string, n int)返回表达式的所有连续匹配的字节开始/结束索引(即 slice ):
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 18] [32 38]]
注意:我在 Microsoft Windows 上执行此操作,但将文件保存为 UNIX 格式(换行);如果输入文件以 Windows 格式保存(回车和换行),字节偏移量将分别增加到 13 和 35。
更新:对于大文件,使用 bufio.Scanner ;例如:
package main
import (
"bufio"
"fmt"
"log"
"os"
"regexp"
)
func main() {
fname, err := os.Open("C:\\Users\\UserName\\go\\src\\so56798431\\fname")
if err != nil {
log.Fatal(err)
}
defer fname.Close()
re, err := regexp.Compile("findme")
if err != nil {
// handle error
}
scanner := bufio.NewScanner(fname)
bytesRead := 0
for scanner.Scan() {
b := scanner.Text()
//fmt.Println(b)
results := re.FindAllStringIndex(b, -1)
for _, result := range results {
fmt.Println(bytesRead + result[0])
}
// account for UNIX EOL marker
bytesRead += len(b) + 1
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
输出:
12
32
关于go - 在 Golang 中查找模式的字节偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56798431/