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

 更新时间:2021年04月25日 15:34:13   作者: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方法。

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

相关文章

  • Go 标准库增加metrics指标探讨分析

    Go 标准库增加metrics指标探讨分析

    go中有一个神奇的标准库 runtime/metrics,提供了一系列预定义好的 Go 自身的相关指标,如果没有编写过基础监控库或者关注的比较少的朋友可能会没接触到这类指标,本文展开现有metrics 指标,并结合现有的社区讨论一起看看还有没有必要增加更多的标准库指标
    2023-10-10
  • Go chassis云原生微服务开发框架应用编程实战

    Go chassis云原生微服务开发框架应用编程实战

    这篇文章主要为大家介绍了Go chassis云原生微服务开发框架应用编程实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go的固定时长定时器和周期性时长定时器

    Go的固定时长定时器和周期性时长定时器

    本文主要介绍了Go的固定时长定时器和周期性时长定时器,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Golang使用反射的动态方法调用详解

    Golang使用反射的动态方法调用详解

    Go是一种静态类型的语言,提供了大量的安全性和性能。这篇文章主要和大家介绍一下Golang使用反射的动态方法调用,感兴趣的小伙伴可以了解一下
    2023-03-03
  • 如何使用腾讯云go sdk 查询对象存储中最新文件

    如何使用腾讯云go sdk 查询对象存储中最新文件

    这篇文章主要介绍了使用腾讯云go sdk 查询对象存储中最新文件,这包括如何创建COS客户端,如何逐页检索对象列表,并如何对结果排序以找到最后更新的对象,我们还展示了如何优化用户体验,通过实时进度更新和检索多个文件来改进程序,需要的朋友可以参考下
    2024-03-03
  • 盘点几种Go语言开发的IDE

    盘点几种Go语言开发的IDE

    Go语言作为一种新兴的编程语言,近年来受到了越来越多的关注,它以其简洁、高效和并发性能而闻名,被广泛应用于各种软件开发项目中,本文将介绍几种常用的Go语言IDE,并对它们进行比较,帮助开发者根据自己的需求选择合适的工具,需要的朋友可以参考下
    2023-11-11
  • Golang共享变量如何解决问题

    Golang共享变量如何解决问题

    协程之间的通信只能够通过通道。但是我们习惯于共享变量,而且很多时候使用共享变量能让代码更简洁。那么Golang共享变量如何解决问题,感兴趣的可以了解一下
    2021-12-12
  • golang开启mod后import报红的简单解决方案

    golang开启mod后import报红的简单解决方案

    这篇文章主要给大家介绍了关于golang开启mod后import报红的简单解决方案,文中通过图文将解决的办法介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • go sync Waitgroup数据结构实现基本操作详解

    go sync Waitgroup数据结构实现基本操作详解

    这篇文章主要为大家介绍了go sync Waitgroup数据结构实现基本操作详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 一文详解Golang中的匿名变量

    一文详解Golang中的匿名变量

    匿名变量是一种特殊类型的变量,可以简化代码并提高可读性,本文将为大家详细介绍一下golang中匿名变量的定义、特性和使用方法,需要的可以参考下
    2023-09-09

最新评论