初始版本
pkg/grep/search.go:
package grep
import (
"bufio"
"os"
"regexp"
"strings"
)
func Grep(pattern string, filePath string) ([]string, error) {
file, err := os.Open(filePath)
if err != nil {
return nil, err
}
defer file.Close()
var matchingLines []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
match, err := regexp.MatchString(pattern, line)
if err != nil {
return nil, err
}
if match {
matchingLines = append(matchingLines, strings.TrimLeft(line, " \t"))
}
}
if err := scanner.Err(); err != nil {
return nil, err
}
return matchingLines, nil
}
regexp
包提供正则表达式功能,其是用于文本模式匹配的强大工具。
main.go:
package main
import (
"flag"
"fmt"
"log"
"github.com/Literank/gorep/pkg/grep"
)
func main() {
flag.Parse()
// 获取位置参数
// pattern - 要搜索匹配的模式
// file_path - 要搜索匹配的文件路径
args := flag.Args()
if len(args) < 2 {
log.Fatal("Both pattern and file_path are required")
}
result, err := grep.Grep(args[0], args[1])
if err != nil {
log.Fatal(err)
}
for _, line := range result {
fmt.Println(line)
}
}
flag
包提供了一种方便的方式来定义和解析命令行参数,包括标志和位置参数。它是一个标准库包,简化了处理程序命令行输入的过程。
尝试运行:
# 在文件 main.go 中查找“result”
go run main.go result main.go
得到如下结果:
result, err := grep.Grep(args[0], args[1])
for _, line := range result {