Go за Прикладом: Рядкові Фільтри

Фільтр рядків це тип програм, що отримують дані з стандартного потоку введення, обробляють їх та видають результати роботи назад (до стандартного потоку виведення). Одним з найвідоміших прикладів рядкових фільтрів є grep та sed. Ми розглянемо приклад створення рядкового фільтра: що поверне текст переданий до нього конвертованим до верхнього регістру. Скористайтесь цим зразоком, для написання власного фільтра в майбутньому.

package main
import (
    "bufio"
    "fmt"
    "os"
    "strings"
)
func main() {

Використання небуферизованого os.Stdin через буферизований сканер дає нам доступ до методу Scan, який пересуватиме сканер до наступного токену (а ним у нас є символ переносу “\n”).

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

Text повертає поточний токен (в нашому прикладі - наступна лінія вхідних даних).

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

Передача результату назад до стандартного потоку виводу, за допомогою fmt.Println.

        fmt.Println(ucl)
    }

Перевірка помилок підчас роботи Scan. “Кінець файлу” - це очікувана помилка і про неї не буде повідомлено Scan як “помилка” взагалі.

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

Для теста нашого рядкового фільтра, створимо файл з кількома рядками у нижньому регістрі.

$ echo 'hello'   > /tmp/lines
$ echo 'filter' >> /tmp/lines

Після чого прочитаємо зміст файлу та перенаправимо потік у наш фільтр, для того, щоб отримати його назад у верхньому регістрі.

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

Наступний приклад: Файлові Шляхи.