github.com/Benchkram/bob@v0.0.0-20220321080157-7c8f3876e225/pkg/multilinecmd/multilinecmd.go (about) 1 package multilinecmd 2 3 import ( 4 "strings" 5 ) 6 7 // Split splits a single-line "command" to a slice of commands. 8 // 9 // It currently supports the following syntaxes: 10 // 11 /* 12 Input: 13 echo Hello 14 Output: 15 [ "echo Hello", ] 16 17 Input: 18 echo Hello 19 some long \ 20 command \ 21 with multiple line-breaks 22 Output: 23 [ 24 "echo Hello", 25 "some long command with multiple line-breaks", 26 ] 27 */ 28 func Split(cmd string) []string { 29 // Remove backslash-newlines with a space. 30 // This adds support to use single commands spanning across multiple lines. 31 cmd = strings.ReplaceAll(cmd, "\\\n", " ") 32 33 // Replace multiple spaces with a single one. 34 // TODO: Reenable? echo 'Hello World' will then no longer echo with two spaces. 35 // cmd = regexp.MustCompile(` +`).ReplaceAllString(cmd, " ") 36 37 // Replace leading and trailing spaces for clarity. 38 cmd = strings.TrimSpace(cmd) 39 40 cmds := strings.Split(cmd, "\n") 41 if len(cmds) == 1 && len(cmds[0]) == 0 { 42 return []string{} 43 } 44 45 return cmds 46 }