用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方法。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
您可能感兴趣的文章:- 基于golang中container/list包的用法说明
- Golang中List的实现方法示例详解
- golang使用grpc+go-kit模拟oauth认证的操作
- golang中for range的取地址操作陷阱介绍
- golang如何去除多余空白字符(含制表符)
- golang正则之命名分组方式
- 解决golang中container/list包中的坑