首页 > 文章列表 > 用golang如何替换某个文件中的字符串

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

golang
306 2022-12-17

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