用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 02 Golang
go语言-在mac下brew升级golang
Apr 25 Golang
Golang 正则匹配效率详解
Apr 25 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang 结构体数据集合
Apr 22 Golang
在ubuntu下安装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
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
Linux系统下PHP-FPM的安装和配置教程
2015/08/17 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
JavaScript 继承详解(一)
2009/07/13 Javascript
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
python实现百度关键词排名查询
2014/03/30 Python
Python正则表达式的使用范例详解
2014/08/08 Python
python创建关联数组(字典)的方法
2015/05/04 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
django创建超级用户过程解析
2019/09/18 Python
python 如何停止一个死循环的线程
2020/11/24 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
自我评价范文
2013/12/22 职场文书
网上商城创业计划书范文
2014/01/31 职场文书
2015年维修电工工作总结
2015/04/25 职场文书
党员转正意见怎么写
2015/06/03 职场文书
信息技术国培研修日志
2015/11/13 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
员工升职自我评价
2019/03/26 职场文书