Line Filters

Line Filters #

// Um _line filter_, ou filtro de linha, é um tipo comum
// de software que lê o input em `stdin`, processa,
// e então imprime um resultado em `stdout`.
// Os comandos `grep` e `sed` do Linux são exemplos
// de line filters.

// Aqui está um exemplo de filtro de linha em Go,
// que escreve uma versão em letras maiusculas do
// texto de entrada. Este padrão pode ser utilizado
// para escrever novos filtros de linha.
package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {

	// Envelopar o `os.Stdin` `unbuffered` com um
	// scanner `buffered` resulta em um método
	// conveniente de `Scan` que avança o scanner para
	// o próximo token; que é a próxima linha em um scanner
	// padrão.
	scanner := bufio.NewScanner(os.Stdin)

	for scanner.Scan() {
		// `Text` retorna o token atual, a próxima
		// linha do input.
		ucl := strings.ToUpper(scanner.Text())

		// Escreve a linha com letras maiusculas.
		fmt.Println(ucl)
	}

	// Verfica erros durante o `Scan`. O final do arquivo
	// é esperado pelo `Scan` e não reportado como um erro.
	if err := scanner.Err(); err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
}
# Para executar o filtro de linha, primeiro
# crie um arquivo de texto com linhas em
# letras minusculas.
$ echo 'hello'   > /tmp/lines
$ echo 'filter' >> /tmp/lines

# Então use o filtro de linha para ter as
# linhas em letras maiusculas.
$ cat /tmp/lines | go run line-filters.go
HELLO
FILTER