Line Filters - 线路滤波器

线路滤波器 {.zh}

line filter是一种常见的程序类型,它读取stdin上的输入,处理它,然后将一些衍生的结果打印到stdout。 grepsed是公共线过滤器。这是Go中的一个示例行过滤器,用于写入所有输入文本的资本化版本。您可以使用此模式编写自己的Go行过滤器。

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. "strings"
  7. )
  8. func main() {

使用bufferedscanner包装无缓冲的os.Stdin为我们提供了一种方便的Scan方法,可以将扫描器提供给下一个令牌;这是默认扫描仪中的下一行。

  1. scanner := bufio.NewScanner(os.Stdin)
  2. for scanner.Scan() {

Text从输入返回当前标记,这里是下一行。

  1. ucl := strings.ToUpper(scanner.Text())

写出大写的线。

  1. fmt.Println(ucl)
  2. }

在“扫描”期间检查错误。文件结束是预期的,并且不会被“扫描”报告为错误。

  1. if err := scanner.Err(); err != nil {
  2. fmt.Fprintln(os.Stderr, "error:", err)
  3. os.Exit(1)
  4. }
  5. }

要试用我们的线路过滤器,首先要制作一个带有一些低速线路的文件。

  1. $ echo 'hello' > /tmp/lines
  2. $ echo 'filter' >> /tmp/lines

然后使用线条过滤器获取大写行。

  1. $ cat /tmp/lines | go run line-filters.go
  2. HELLO
  3. FILTER