package main import ( "os" "io" "index/suffixarray" "regexp" "strconv" "log" ) func main() { f, err := os.Open(os.Args[1]) if err != nil { log.Fatal(err) } n, err := strconv.Atoi(os.Args[2]) if err != nil { log.Fatal(err) } regexps := []*regexp.Regexp{} for _, re := range os.Args[3:] { re = "(?m:" + re + ")" re_compiled, err := regexp.Compile(re) if err != nil { log.Fatal(re, err) } regexps = append(regexps, re_compiled) } data := make([]byte, n) count, err := f.Read(data) if err != nil && err != io.EOF { log.Fatal(err) } data = data[:count] print("loaded ", count, " bytes; building index...") index := suffixarray.New(data) print("done.\n") for _, re_compiled := range regexps { for _, match := range index.FindAllIndex(re_compiled, -1) { print(string(data[match[0]:match[1]]), "\n") } } }