用golang如何替换某个文件中的字符串
作者:hackssssss
这篇文章主要介绍了用golang实现替换某个文件中的字符串操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
用golang实现了某个文件中字符的替换,替换为按行替换,执行后会生成新文件,如a.txt,执行后生成a.txt.mdf。新文件即修改后的内容。
主要用来练习文件的读取与写入
package main import ( "bufio" "fmt" "io" "os" "strings" ) func main() { if len(os.Args) != 4 { fmt.Println("lack of config file, eg: go run main.go ${path_of_file} ${old_string} ${new_string}") os.Exit(-1) } fileName := os.Args[1] in, err := os.Open(fileName) if err != nil { fmt.Println("open file fail:", err) os.Exit(-1) } defer in.Close() out, err := os.OpenFile(fileName+".mdf", os.O_RDWR|os.O_CREATE, 0766) if err != nil { fmt.Println("Open write file fail:", err) os.Exit(-1) } defer out.Close() br := bufio.NewReader(in) index := 1 for { line, _, err := br.ReadLine() if err == io.EOF { break } if err != nil { fmt.Println("read err:", err) os.Exit(-1) } newLine := strings.Replace(string(line), os.Args[2], os.Args[3], -1) _, err = out.WriteString(newLine + "\n") if err != nil { fmt.Println("write to file fail:", err) os.Exit(-1) } fmt.Println("done ", index) index++ } fmt.Println("FINISH!") }
执行结果:
源文件:
将空格替换为逗号:
新文件:
补充:golang关于字符串替换的建议
运行下面一段代码
package main import ( "fmt" "regexp" ) func main() { tmp := "/Users/max/Downloads/test/website\\nbackup\n" buf := []byte(tmp) a := "/Users/max/Downloads/test/website\\nbackup" r := regexp.MustCompile(a + "\n") taskText := r.ReplaceAllString(string(buf[:]), "") fmt.Println(r.String() == string(buf[:])) fmt.Printf("%q\n", r.String()) fmt.Printf("%q\n", string(buf[:])) fmt.Printf("%q\n", taskText) }
结果输出:
true
"/Users/max/Downloads/test/website\\nbackup\n"
"/Users/max/Downloads/test/website\\nbackup\n"
"/Users/max/Downloads/test/website\\nbackup\n"
可以发现,字符串并没有被替换
然后,我们更改一句代码
package main import ( "fmt" "regexp" "strings" ) func main() { tmp := "/Users/max/Downloads/test/website\\nbackup\n" buf := []byte(tmp) a := "/Users/max/Downloads/test/website\\nbackup" r := regexp.MustCompile(a + "\n") // taskText := r.ReplaceAllString(string(buf[:]), "") taskText := strings.ReplaceAll(string(buf[:]), r.String(), "") fmt.Println(r.String() == string(buf[:])) fmt.Printf("%q\n", r.String()) fmt.Printf("%q\n", string(buf[:])) fmt.Printf("%q\n", taskText) }
结果输出:
true
"/Users/max/Downloads/test/website\\nbackup\n"
"/Users/max/Downloads/test/website\\nbackup\n"
""
可以发现,字符串可以被替换
所以,建议在使用字符串替换时,避免使用正则表达式的ReplaceAllString方法,而应该选择更为稳妥的strings包中的ReplaceAll方法。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。