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

將空格替換為逗號:

新文件:

補充: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"
可以發(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)
}
結果輸出:
true
"/Users/max/Downloads/test/website\\nbackup\n"
"/Users/max/Downloads/test/website\\nbackup\n"
""
可以發(fā)現(xiàn),字符串可以被替換
所以,建議在使用字符串替換時,避免使用正則表達式的ReplaceAllString方法,而應該選擇更為穩(wěn)妥的strings包中的ReplaceAll方法。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關文章
Go?chassis云原生微服務開發(fā)框架應用編程實戰(zhàn)
這篇文章主要為大家介紹了Go?chassis云原生微服務開發(fā)框架應用編程實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
Golang使用反射的動態(tài)方法調(diào)用詳解
Go是一種靜態(tài)類型的語言,提供了大量的安全性和性能。這篇文章主要和大家介紹一下Golang使用反射的動態(tài)方法調(diào)用,感興趣的小伙伴可以了解一下2023-03-03
go?sync?Waitgroup數(shù)據(jù)結構實現(xiàn)基本操作詳解
這篇文章主要為大家介紹了go?sync?Waitgroup數(shù)據(jù)結構實現(xiàn)基本操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01

