用golang如何替換某個(gè)文件中的字符串
用golang實(shí)現(xiàn)了某個(gè)文件中字符的替換,替換為按行替換,執(zhí)行后會(huì)生成新文件,如a.txt,執(zhí)行后生成a.txt.mdf。新文件即修改后的內(nèi)容。
主要用來(lái)練習(xí)文件的讀取與寫入
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!")
}
執(zhí)行結(jié)果:
源文件:

將空格替換為逗號(hào):

新文件:

補(bǔ)充:golang關(guān)于字符串替換的建議
運(yùn)行下面一段代碼
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)
}
結(jié)果輸出:
true
"/Users/max/Downloads/test/website\\nbackup\n"
"/Users/max/Downloads/test/website\\nbackup\n"
"/Users/max/Downloads/test/website\\nbackup\n"
可以發(fā)現(xià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)
}
結(jié)果輸出:
true
"/Users/max/Downloads/test/website\\nbackup\n"
"/Users/max/Downloads/test/website\\nbackup\n"
""
可以發(fā)現(xiàn),字符串可以被替換
所以,建議在使用字符串替換時(shí),避免使用正則表達(dá)式的ReplaceAllString方法,而應(yīng)該選擇更為穩(wěn)妥的strings包中的ReplaceAll方法。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Ruby序列化和持久化存儲(chǔ)(Marshal、Pstore)操作方法詳解
這篇文章主要介紹了Ruby序列化和持久化存儲(chǔ)(Marshal、Pstore)操作方法詳解,包括Ruby Marshal序列化,Ruby Pstore存儲(chǔ),需要的朋友可以參考下2022-04-04
Golang實(shí)現(xiàn)多存儲(chǔ)驅(qū)動(dòng)設(shè)計(jì)SDK案例
這篇文章主要介紹了Golang實(shí)現(xiàn)多存儲(chǔ)驅(qū)動(dòng)設(shè)計(jì)SDK案例,Gocache是一個(gè)基于Go語(yǔ)言編寫的多存儲(chǔ)驅(qū)動(dòng)的緩存擴(kuò)展組件,更多具體內(nèi)容感興趣的小伙伴可以參考一下2022-09-09
Golang函數(shù)重試機(jī)制實(shí)現(xiàn)代碼
在編寫應(yīng)用程序時(shí),有時(shí)候會(huì)遇到一些短暫的錯(cuò)誤,例如網(wǎng)絡(luò)請(qǐng)求、服務(wù)鏈接終端失敗等,這些錯(cuò)誤可能導(dǎo)致函數(shù)執(zhí)行失敗,這篇文章主要介紹了Golang函數(shù)重試機(jī)制實(shí)現(xiàn)代碼,需要的朋友可以參考下2024-04-04
Go語(yǔ)言對(duì)JSON進(jìn)行編碼和解碼的方法
這篇文章主要介紹了Go語(yǔ)言對(duì)JSON進(jìn)行編碼和解碼的方法,涉及Go語(yǔ)言操作json的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
Golang實(shí)現(xiàn)對(duì)map的并發(fā)讀寫的方法示例
這篇文章主要介紹了Golang實(shí)現(xiàn)對(duì)map的并發(fā)讀寫的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03

