用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结构体嵌套的切片数组操作
Apr 28 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
go类型转换及与C的类型转换方式
May 05 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
go 实现简易端口扫描的示例
May 22 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
golang 语言中错误处理机制
Aug 30 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
golang中的struct操作
Nov 11 Golang
golang语言指针操作
Apr 14 Golang
Go语言编译原理之源码调试
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使用数组实现队列
2012/02/05 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
php简单获取目录列表的方法
2015/03/24 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
javascript实现日历控件(年月日关闭按钮)
2012/12/12 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
js编码、解码函数介绍及其使用示例
2013/09/05 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
跟我学习javascript的prototype,getPrototypeOf和__proto__
2015/11/17 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
vue实现路由监听和参数监听
2019/10/29 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
Python类的专用方法实例分析
2015/01/09 Python
python隐藏终端执行cmd命令的方法
2019/06/24 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
师德师风承诺书
2014/05/23 职场文书
镇班子对照检查材料思想汇报
2014/09/24 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python