Рядкові Фільтри|Line Filters
#
// _Фільтр рядків_ це тип програм, що отримують дані з
// [стандартного потоку введення](https://uk.wikipedia.org/wiki/Стандартні_потоки),
// обробляють їх та видають результати роботи назад (до стандартного
// потоку виведення). Одним з найвідоміших прикладів рядкових
// фільтрів є `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