Редовѝ филтър е често срещан вид програма, която чете данни от
стандартния вход, обработва го и после извежда произведеното на
стандартния изход. grep и sed са такива редовѝ филтри.
Ето примерен редовѝ филтър на Го, който извежда на екрана въведения словоплет, но с всички букви, превърнати в главни. Можете да ползвате този подход за писане на ваши собствени редовѝ филтри.
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
Като обгърнем нескладиращия поток os.Stdin със складиращ скенер,
придобиваме удобен метод Scan, който премества скенера до следващ
белег (token), който по подразбиране е знакът за нов ред.
scanner := bufio.NewScanner(os.Stdin)
Text връща събраното до белега при последното извикване на Scan.
В случая това е следващият ред от каквото е въвел потребителят и
накрая е натиснал Enter/Return/↵
for scanner.Scan() {
ucl := strings.ToUpper(scanner.Text())
Извеждаме обърнтия в главни букви ред.
fmt.Println(ucl)
}
Проверяваме за грешки при сканирането. Грешката „Край на файл” е
очаквана и не с докладва от Scan като грешка.
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "error:", err)
os.Exit(1)
}
}
За да пробваме нашия редовѝ филтър, първо ще създадем файл с няколко реда с малки букви.
$ echo 'здрасти' > /tmp/редове
$ echo 'цедко' >> /tmp/редове
После ползваме филтъра, за да изведем редовете, обърнати в главни букви.
$ cat /tmp/редове | go run line-filters.go
ЗДРАСТИ
ЦЕДКО
Следващ пример: Файлови пѫтища.