当前位置 博文首页 > 用golang如何替换某个文件中的字符串

    用golang如何替换某个文件中的字符串

    作者:hackssssss 时间:2021-06-03 18:06

    用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方法。

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持站长博客。如有错误或未考虑完全的地方,望不吝赐教。

    js
    下一篇:没有了