» Go创建命令行程序grep » 2. 开发 » 2.2 初始版本

初始版本

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 {