用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 相关文章推荐
golang在GRPC中设置client的超时时间
Apr 27 Golang
golang json数组拼接的实例
Apr 28 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
go 实现简易端口扫描的示例
May 22 Golang
golang内置函数len的小技巧
Jul 25 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang 字符串的常见操作
Apr 19 Golang
Golang入门之计时器
May 04 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 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等比例缩放图片
2016/10/12 PHP
降低PHP Redis内存占用
2017/03/23 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
JS hashMap实例详解
2016/05/26 Javascript
jQuery图片左右滚动代码 有左右按钮实例
2016/06/20 Javascript
javascript 常用验证函数总结
2016/06/28 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
JavaScript同源策略和跨域访问实例详解
2018/04/03 Javascript
JavaScript私有变量实例详解
2019/01/24 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
浅谈编码,解码,乱码的问题
2016/12/30 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
python自动点赞功能的实现思路
2020/02/26 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
10种CSS3实现的loading动画,挑一个走吧?
2020/11/16 HTML / CSS
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
美国办公用品折扣网站:Shoplet.com
2019/11/24 全球购物
应届生法律求职信
2013/10/22 职场文书
应届生个人求职信模板
2013/11/26 职场文书
2014教师党员个人自我评议
2014/09/20 职场文书
五年级上册复习计划
2015/01/19 职场文书
2016公司新年问候语
2015/11/11 职场文书
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL