批量替换模版文件代码分享

前端之家收集整理的这篇文章主要介绍了批量替换模版文件代码分享前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "bytes"
  6. "flag"
  7. "fmt"
  8. "io"
  9. "io/IoUtil"
  10. "os"
  11. )
  12.  
  13. func main() {
  14. config := flag.String("f","replations.ini","-f replations.ini")
  15. dir := flag.String("d","config","-d configdir")
  16. flag.Parse()
  17. M,err := ParseConfig(*config)
  18. if err != nil {
  19. fmt.Println(err)
  20. return
  21. }
  22. err = AutoReplace(*dir,M)
  23. if err != nil {
  24. fmt.Println(err)
  25. return
  26. }
  27. }
  28.  
  29. func ParseConfig(configpath string) (map[string]string,error) {
  30. file,err := os.Open(configpath)
  31. if err != nil {
  32. return nil,err
  33. }
  34. defer file.Close()
  35. M := make(map[string]string)
  36. buf := bufio.NewReader(file)
  37. var num int
  38. for {
  39. line,_,err := buf.ReadLine()
  40. if err != nil {
  41. if err.Error() == "EOF" {
  42. break
  43. }
  44. return nil,err
  45. }
  46. list := bytes.Split(line,[]byte("="))
  47. if len(list) != 2 {
  48. return nil,fmt.Errorf("第%d行 出现多次'='",num)
  49. }
  50. M[string(bytes.TrimSpace(list[0]))] = string(bytes.TrimSpace(list[1]))
  51. num++
  52. }
  53. return M,nil
  54. }
  55.  
  56. func AutoReplace(dirpath string,variablesMap map[string]string) error {
  57. Files,err := getFiles(dirpath)
  58. if err != nil {
  59. return err
  60. }
  61. for fileName,body := range Files {
  62. fmt.Println(string(body))
  63. for k,v := range variablesMap {
  64. body = bytes.Replace(body,[]byte(k),[]byte(fmt.Sprintf("{{.%s}}",v)),-1)
  65. }
  66. F,err := os.OpenFile(fileName,os.O_CREATE|os.O_RDWR|os.O_TRUNC,0644)
  67. if err != nil {
  68. F.Close()
  69. return err
  70. }
  71. F.Write(body)
  72. F.Close()
  73. }
  74. return nil
  75. }
  76.  
  77. func getFiles(path string) (map[string][]byte,error) {
  78. if !bytes.HasSuffix([]byte(path),[]byte("/")) {
  79. path = path + "/"
  80. }
  81. files,err := IoUtil.ReadDir(path)
  82. if err != nil || len(files) <= 0 {
  83. return nil,err
  84. }
  85. var fileInfo map[string][]byte = make(map[string][]byte)
  86. for _,file := range files {
  87. if file.IsDir() {
  88. continue
  89. }
  90. F,err := os.Open(path + file.Name())
  91. if err != nil {
  92. return nil,err
  93. }
  94. buf := make([]byte,file.Size())
  95. n,err := io.ReadFull(F,buf)
  96. if err != nil {
  97. return nil,err
  98. }
  99. if bytes.Contains(buf[:n],[]byte{0}) {
  100. continue
  101. }
  102. fileInfo[path+file.Name()] = buf[:n]
  103. }
  104. return fileInfo,nil
  105. }

猜你在找的Go相关文章