用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 26 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
golang 比较浮点数的大小方式
May 02 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
Go标准容器之Ring的使用说明
May 05 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang jwt身份认证
Apr 20 Golang
深入理解 Golang 的字符串
May 04 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代码的53条建议
2008/03/27 PHP
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
php小技巧之过滤ascii控制字符
2014/05/14 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
2014/07/05 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
PHPMailer发送邮件
2016/12/28 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
PHP实现PDO操作mysql存储过程示例
2019/02/13 PHP
Jquery下的26个实用小技巧(jQuery tips, tricks & solutions)
2010/03/01 Javascript
js自执行函数的几种不同写法的比较
2012/08/16 Javascript
js函数中onmousedown和onclick的区别和联系探讨
2013/05/19 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
2016/08/10 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
微信小程序之蓝牙的链接
2017/09/26 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
Vue页面跳转动画效果的实现方法
2018/09/23 Javascript
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
three.js搭建室内场景教程
2018/12/30 Javascript
Python中的字典与成员运算符初步探究
2015/10/13 Python
SVM基本概念及Python实现代码
2017/12/27 Python
python之从文件读取数据到list的实例讲解
2018/04/19 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
Java语言程序设计测试题判断题部分
2013/01/06 面试题
自荐信不宜过于夸大
2013/11/06 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
长江七号观后感
2015/06/11 职场文书
2016国培学习心得体会
2016/01/08 职场文书
python 提取html文本的方法
2021/05/20 Python