String 读取文本文件,替换其文字,输出到另一个文本文件

String 读取文本文件,替换其文字,输出到另一个文本文件,string,file,text,replace,go,String,File,Text,Replace,Go,所以我试图在GO中制作一个程序,获取一个充满代码的文本文件,并将其转换为GO代码,然后将该文件保存为GO文件或文本文件。我一直在试图找出如何保存对文本文件所做的更改,但我看到更改的唯一方法是通过println语句,因为我使用strings.replace搜索文本文件存储的字符串数组,并更改需要更改的单词的每次出现(例如BEGIN->{和END->})。那么,有没有其他我不知道的搜索和替换GO的方法,或者有没有编辑我不知道的文本文件的方法,或者这是不可能的 谢谢 这是我到目前为止的代码 packa

所以我试图在GO中制作一个程序,获取一个充满代码的文本文件,并将其转换为GO代码,然后将该文件保存为GO文件或文本文件。我一直在试图找出如何保存对文本文件所做的更改,但我看到更改的唯一方法是通过println语句,因为我使用strings.replace搜索文本文件存储的字符串数组,并更改需要更改的单词的每次出现(例如BEGIN->{和END->})。那么,有没有其他我不知道的搜索和替换GO的方法,或者有没有编辑我不知道的文本文件的方法,或者这是不可能的

谢谢

这是我到目前为止的代码

package main

import (
    "os"
    "bufio"
    "bytes"
    "io"
    "fmt"
    "strings"
)


func readLines(path string) (lines []string, errr error) {
    var (
        file *os.File
        part []byte
        prefix bool
    )
    if file, errr = os.Open(path); errr != nil {
        return
    }
    defer file.Close()

    reader := bufio.NewReader(file)
    buffer := bytes.NewBuffer(make([]byte, 0))
    for {
        if part, prefix, errr = reader.ReadLine(); errr != nil {
            break
        }
    buffer.Write(part)
        if !prefix {
            lines = append(lines, buffer.String())
            buffer.Reset()
        }
    }
    if errr == io.EOF {
        errr = nil
    }
    return
}

func writeLines(lines []string, path string) (errr error) {
    var (
        file *os.File
    )

    if file, errr = os.Create(path); errr != nil {
        return
    }
    defer file.Close()


    for _,item := range lines {

        _, errr := file.WriteString(strings.TrimSpace(item) + "\n");

        if errr != nil {

            fmt.Println(errr)
            break
        }
    }

    return
}

func FixBegin(lines []string) (errr error) {
    var(
    a string

    )
for i := 0; ; i++ {
        a = lines[i];

        fmt.Println(strings.Replace(a, "BEGIN", "{", -1))
    }

    return
}

func FixEnd(lines []string) (errr error) {
    var(
    a string

    )
for i := 0; ; i++ {
        a = lines[i];

        fmt.Println(strings.Replace(a, "END", "}", -1))
    }
    return
}

func main() {
    lines, errr := readLines("foo.txt")
    if errr != nil {
        fmt.Println("Error: %s\n", errr)
        return
    }
    for _, line := range lines {
        fmt.Println(line)
    }


    errr = FixBegin(lines)

    errr = writeLines(lines, "beer2.txt")
    fmt.Println(errr)

    errr = FixEnd(lines)
    lines, errr = readLines("beer2.txt")
    if errr != nil {
        fmt.Println("Error: %s\n", errr)
        return
    }
    errr = writeLines(lines, "beer2.txt")
    fmt.Println(errr)
}

我同意@jnml wrt使用ioutil读取文件并将其写回。但是我认为替换不应该通过多次通过[]字节来完成。代码和数据是字符串/文本,应按此处理(即使处理非ascii/utf8编码需要estra工作);一次性替换(一次替换所有占位符)避免了替换以前更改的结果的风险(即使我的regexp建议必须改进以处理非琐碎任务)

输出:

go run 13789882.go
----
func main() BEGIN
END
----
/BEGIN|END/
*** 'BEGIN'
*** 'END'
----
func main() {
}
----

如果您的文件很大,则可能无法读取内存中的所有内容,也不建议这样做。尝试一下流媒体方式中的“原样替换”。而且它的性能合理。如果要替换两个字符串(如
BEGIN->{
END->}
),只需将两个
字节replacingreader
包装在原始读取器上,一个用于
BEGIN
,另一个用于
END

r := NewBytesReplacingReader(
    NewBytesReplacingReader(inputReader, []byte("BEGIN"), []byte("{"),
    []byte("END"), []byte("}")
// use r normally and all non-overlapping occurrences of
// "BEGIN" and "END" will be replaced with "{" and "}"

非常感谢你的回答!!我不知道有那么容易!!简单方法:
sed
想成为你的朋友:
$sed-e's/BEGIN/{/g'-e's/END/}/g'foo.txt#-)
go run 13789882.go
----
func main() BEGIN
END
----
/BEGIN|END/
*** 'BEGIN'
*** 'END'
----
func main() {
}
----
r := NewBytesReplacingReader(
    NewBytesReplacingReader(inputReader, []byte("BEGIN"), []byte("{"),
    []byte("END"), []byte("}")
// use r normally and all non-overlapping occurrences of
// "BEGIN" and "END" will be replaced with "{" and "}"