批量替换模版文件代码分享
2016-03-01 10:43
197 查看
package main import ( "bufio" "bytes" "flag" "fmt" "io" "io/ioutil" "os" ) func main() { config := flag.String("f", "replations.ini", "-f replations.ini") dir := flag.String("d", "config", "-d configdir") flag.Parse() M, err := ParseConfig(*config) if err != nil { fmt.Println(err) return } err = AutoReplace(*dir, M) if err != nil { fmt.Println(err) return } } func ParseConfig(configpath string) (map[string]string, error) { file, err := os.Open(configpath) if err != nil { return nil, err } defer file.Close() M := make(map[string]string) buf := bufio.NewReader(file) var num int for { line, _, err := buf.ReadLine() if err != nil { if err.Error() == "EOF" { break } return nil, err } list := bytes.Split(line, []byte("=")) if len(list) != 2 { return nil, fmt.Errorf("第%d行 出现多次'='", num) } M[string(bytes.TrimSpace(list[0]))] = string(bytes.TrimSpace(list[1])) num++ } return M, nil } func AutoReplace(dirpath string, variablesMap map[string]string) error { Files, err := getFiles(dirpath) if err != nil { return err } for fileName, body := range Files { fmt.Println(string(body)) for k, v := range variablesMap { body = bytes.Replace(body, []byte(k), []byte(fmt.Sprintf("{{.%s}}", v)), -1) } F, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0644) if err != nil { F.Close() return err } F.Write(body) F.Close() } return nil } func getFiles(path string) (map[string][]byte, error) { if !bytes.HasSuffix([]byte(path), []byte("/")) { path = path + "/" } files, err := ioutil.ReadDir(path) if err != nil || len(files) <= 0 { return nil, err } var fileInfo map[string][]byte = make(map[string][]byte) for _, file := range files { if file.IsDir() { continue } F, err := os.Open(path + file.Name()) if err != nil { return nil, err } buf := make([]byte, file.Size()) n, err := io.ReadFull(F, buf) if err != nil { return nil, err } if bytes.Contains(buf[:n], []byte{0}) { continue } fileInfo[path+file.Name()] = buf[:n] } return fileInfo, nil }
相关文章推荐
- Go 语言 Channel 实现原理精要
- Go语言将支持Android
- SQLSERVER 中GO的作用详解
- Golang实现的聊天程序服务端和客户端代码分享
- Go语言入门教程之Arrays、Slices、Maps、Range操作简明总结
- 在Go语言程序中使用gojson来解析JSON格式文件
- 举例详解Go语言中os库的常用函数用法
- Go语言中函数的参数传递与调用的基本方法
- GO语言异常处理机制panic和recover分析
- 深入解析Go语言的io.ioutil标准库使用
- GO语言的IO方法实例小结
- Go语言的os包中常用函数初步归纳
- go语言执行windows下命令行的方法
- Go语言计算两个经度和纬度之间距离的方法
- Go语言排序与接口实例分析
- Go语言导出内容到Excel的方法
- go语言实现sqrt的方法
- Go语言中数组的基本用法演示
- Go语言MessageBox用法实例
- Go语言判断指定文件是否存在的方法