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


Posted in Golang onApril 25, 2021

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

将空格替换为逗号:

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

新文件:

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

补充: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 相关文章推荐
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
Golang 编译成DLL文件的操作
May 06 Golang
golang switch语句的灵活写法介绍
May 06 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Golang bufio详细讲解
Apr 21 Golang
Golang解析JSON对象
Apr 30 Golang
基于Python实现西西成语接龙小助手
Aug 05 Golang
Golang 正则匹配效率详解
golang正则之命名分组方式
Apr 25 #Golang
go语言-在mac下brew升级golang
Apr 25 #Golang
go原生库的中bytes.Buffer用法
Apr 25 #Golang
Go缓冲channel和非缓冲channel的区别说明
Apr 25 #Golang
Go语言使用select{}阻塞main函数介绍
win10下go mod配置方式
You might like
php include,include_once,require,require_once
2008/09/05 PHP
php 远程图片保存到本地的函数类
2008/12/08 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
js正确获取元素样式详解
2009/08/07 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
layui使用label标签的方法
2019/09/14 Javascript
python自动安装pip
2014/04/24 Python
Python入门篇之列表和元组
2014/10/17 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
Python之多进程与多线程的使用
2021/02/23 Python
HTML5 直播疯狂点赞动画实现代码 附源码
2020/04/14 HTML / CSS
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
计算机专业个人求职自荐信
2013/09/21 职场文书
应届毕业生的自我鉴定
2013/11/13 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android