GoLSh/cmd/grep.go
2025-06-24 16:02:09 -05:00

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()}
}