亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Golang 中查找模式的字節偏移量

在 Golang 中查找模式的字節偏移量

Go
縹緲止盈 2023-06-26 17:43:02
我們可以通過“grep -ob模式文件名”找到文件中模式的字節偏移量;然而,grep并不utf8安全。如何在 Go 中找到模式的字節偏移量?該文件是進程日志,可以以TB為單位。這就是我想要在 Go 中得到的:$ cat fnamehello worldfindmehello 世界findme again...$ grep -ob findme fname12:findme32:findme
查看完整描述

1 回答

?
元芳怎么了

TA貢獻1798條經驗 獲得超7個贊

FindAllStringIndex(s string, n int)返回表達式所有連續匹配的字節開始/結束索引(即切片):

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


查看完整回答
反對 回復 2023-06-26
  • 1 回答
  • 0 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號