您的位置:首页技术文章

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

【字号: 日期:2023-09-28 16:09:41浏览:6作者:馨心

用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 := 1for {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如何替换某个文件中的字符串

将空格替换为逗号:

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

新文件:

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

补充:golang关于字符串替换的建议

运行下面一段代码

package mainimport ( 'fmt' 'regexp')func main() { tmp := '/Users/max/Downloads/test/websitenbackupn' buf := []byte(tmp) a := '/Users/max/Downloads/test/websitenbackup' r := regexp.MustCompile(a + 'n') taskText := r.ReplaceAllString(string(buf[:]), '') fmt.Println(r.String() == string(buf[:])) fmt.Printf('%qn', r.String()) fmt.Printf('%qn', string(buf[:])) fmt.Printf('%qn', taskText)}

结果输出:

true

'/Users/max/Downloads/test/websitenbackupn'

'/Users/max/Downloads/test/websitenbackupn'

'/Users/max/Downloads/test/websitenbackupn'

可以发现,字符串并没有被替换

然后,我们更改一句代码

package mainimport ( 'fmt' 'regexp' 'strings')func main() { tmp := '/Users/max/Downloads/test/websitenbackupn' buf := []byte(tmp) a := '/Users/max/Downloads/test/websitenbackup' 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('%qn', r.String()) fmt.Printf('%qn', string(buf[:])) fmt.Printf('%qn', taskText)}

结果输出:

true

'/Users/max/Downloads/test/websitenbackupn'

'/Users/max/Downloads/test/websitenbackupn'

''

可以发现,字符串可以被替换

所以,建议在使用字符串替换时,避免使用正则表达式的ReplaceAllString方法,而应该选择更为稳妥的strings包中的ReplaceAll方法。

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

标签: Golang
相关文章: