Tu mas Go verziu(2mb), ale moc som to netestoval takze za nic nerucim.
package main
import (
"flag"
"golang.org/x/exp/mmap"
"log"
"os"
"time"
)
var (
what, with, where string
)
func main() {
flag.StringVar(&what, "replace", "", "String to be replaced.")
flag.StringVar(&with, "with", "", "String to act as replacement.")
flag.StringVar(&where, "in", "", "Path to file.")
flag.Parse()
reader, err := mmap.Open(where)
if err != nil {
log.Fatal(err)
}
defer reader.Close()
file, err := os.OpenFile(where, os.O_WRONLY, 0666)
if err != nil {
log.Fatal(err)
}
defer file.Close()
start := time.Now()
defer func() {
log.Println("Elapsed time:", time.Now().Sub(start).String())
}()
var pos int
whatLen := len(what)
cpr := make([]byte, whatLen, whatLen)
first := what[0]
max := reader.Len()
for {
if pos >= max {
log.Println("no match found")
return
}
if reader.At(pos) == first {
if _, err := reader.ReadAt(cpr, int64(pos)); err != nil {
log.Fatal(err)
}
if string(cpr) == what {
if _, err := file.WriteAt([]byte(with), int64(pos)); err != nil {
log.Fatal(err)
} else {
log.Println("Success")
}
return
} else {
pos += whatLen
continue
}
}
pos++
}
}