Skip to content

Instantly share code, notes, and snippets.

@jwendell
Created February 8, 2017 22:16
Show Gist options
  • Save jwendell/d2923b462b4c9d9aa285d55e0e1f7fd6 to your computer and use it in GitHub Desktop.
Save jwendell/d2923b462b4c9d9aa285d55e0e1f7fd6 to your computer and use it in GitHub Desktop.
script to run sed into some files, written in go, for learning purposes
package main
import (
"bufio"
"fmt"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
)
type sed struct {
rulesFilename string
dir string
rules map[string]string
files []string
}
func (s *sed) loadRules() error {
f, err := os.Open(s.rulesFilename)
if err != nil {
return err
}
defer f.Close()
s.rules = make(map[string]string)
scanner := bufio.NewScanner(f)
for scanner.Scan() {
tmp := strings.Split(scanner.Text(), "=")
s.rules[tmp[0]] = tmp[1]
}
return scanner.Err()
}
func (s *sed) loadFiles() error {
s.files = []string{}
err := filepath.Walk(s.dir, func(path string, f os.FileInfo, err error) error {
if !f.IsDir() && strings.HasSuffix(path, ".json") && !strings.Contains(path, "datavirt") {
s.files = append(s.files, path)
}
return nil
})
return err
}
func (s *sed) apply() error {
err := s.loadRules()
if err != nil {
return err
}
err = s.loadFiles()
if err != nil {
return err
}
return s.runSed()
}
func (s *sed) runSed() error {
for _, file := range s.files {
for name, display := range s.rules {
args := fmt.Sprintf(`s|"name": "%s",|"name": "%s",\n "displayName": "%s",|`, name, name, display)
out, err := exec.Command("/usr/bin/sed", "-i", args, file).Output()
if err != nil {
if ee, ok := err.(*exec.ExitError); ok {
fmt.Printf("error executing command.\nstdout: %s\nstderr: %s\n", out, ee.Stderr)
}
return err
}
}
}
return nil
}
func main() {
if len(os.Args) == 1 {
log.Fatalf("Usage: %s <rules-file> [dir]", os.Args[0])
}
var dir string
if len(os.Args) > 2 {
dir = os.Args[2]
} else {
cwd, err := os.Getwd()
if err != nil {
log.Fatalf("Error: %s", err)
}
dir = cwd
}
s := &sed{rulesFilename: os.Args[1], dir: dir}
if err := s.apply(); err != nil {
log.Fatalf("Error: %s", err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment