61 lines
1.1 KiB
Go
61 lines
1.1 KiB
Go
package cmd
|
|
|
|
import (
|
|
"gosh/types"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/fatih/color"
|
|
)
|
|
|
|
func GoshGrep(sh *types.Shell, args map[string]string, input string, regex string) types.CmdOutput {
|
|
re := regexp.MustCompile(regex)
|
|
lines := strings.Split(input, "\n")
|
|
|
|
red := color.New(color.FgRed).SprintFunc()
|
|
|
|
value, ok := args["-C"]
|
|
var err error
|
|
context_lines := 0
|
|
|
|
if ok {
|
|
context_lines, err = strconv.Atoi(value)
|
|
if err != nil {
|
|
return types.CmdOutput{Id: 1, Output: red(err)}
|
|
}
|
|
context_lines++
|
|
}
|
|
|
|
var output strings.Builder
|
|
for i, line := range lines {
|
|
if re.MatchString(line) {
|
|
// Print behind
|
|
if context_lines != 0 {
|
|
for bi := i - context_lines; bi < i; bi++ {
|
|
if bi < 0 {
|
|
continue
|
|
} else {
|
|
output.WriteString(lines[bi] + "\n")
|
|
}
|
|
}
|
|
}
|
|
|
|
output.WriteString(line + "\n")
|
|
|
|
// Print after
|
|
if context_lines != 0 {
|
|
for ai := i + 1; ai < i+context_lines; ai++ {
|
|
if ai > len(lines)-1 {
|
|
continue
|
|
} else {
|
|
output.WriteString(lines[ai] + "\n")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return types.CmdOutput{Id: 0, Output: output.String()}
|
|
}
|