Zpracování textu v UNIXovém shellu a regulární výrazy#

Materiály#

Zadání úlohy#

Vytvořte BASH skript (soubor s příponou .sh), který bude používat UNIXové nástroje pro práci s textem a regulární výrazy ke čtyřem různým úlohám, které si uživatel zvolí přepínači -a až -d:

  • -a vypíše na standardní výstup všechny soubory JPG a PNG z aktuálního adresáře. Poznáte je podle přípony .jpg nebo .png a na velikosti písmen nezáleží. Každý soubor bude na samostatném řádku a řádky budou řazeny podle abecedy.

  • -b přečte text ze standardního vstupu a vypíše na standardní výstup všechny řádky začínající písmenem, dále pokračující celým číslem následovaným stejným písmenem jako na začátku řádky. Na výstupu se objeví vybrané řádky bez čísla a dvou okolních písmen. Uvažujte pouze celá čísla v dekadickém zápisu, která mohou začínat znaménkem + či -. Případné desetinné tečky/čárky se nepovažují za součást čísla.

    Příklad: Následující řádka x2026x Hello vypíše Hello.

  • -c přečte text ze standardního vstupu a najde v něm všechna telefonní čísla ve tvaru +420 xxx xxx xxx, tedy telefonní číslo s českou předvolbou obsahující 9 cifer. Mezery mezi trojicemi cifer jsou volitelné, na jiném místě se mezery nesmí vyskytovat. Telefonní číslo se může nacházet na více řádcích.

  • -d <prefix> (nepovinné) přečte text na standardním vstupu, najde v něm text ve tvaru (file:soubor) a změní jej na text (file:<prefix>soubor).

    Například pro -d lib/ bude (file:foo.h) změněno na (file:lib/foo.h). Předpokládejte, že text <prefix> nebude obsahovat znaky |\.

Při řešení můžete vyjít z následující šablony:

#!/usr/bin/env bash

set -euo pipefail

print_help() {
    echo >&2 "Pouziti skriptu:"
    echo >&2 "$(basename "$0") -h | -a | -b | -c | -d <prefix>"
    exit 1
}

while getopts ":habcd:" opt; do
    case $opt in
        h|:|\?)
            print_help
            ;;
        a) ls -1a | ...
           ;;
        b) sed ...
           ;;
        c) ...
           ;;
        d) prefix=$OPTARG
           sed ...
           ;;
    esac
    exit 0
done
print_help

Domácí příprava na další cvičení#

Předpokládáme, že máte základní znalosti jazyka C a víte, jak funguje překlad ze zdrojových kódů jazyka C do binární spustitelné aplikace (v obecném případě, kdy je zdrojových souborů více).

Dále byste měli umět použít překladač gcc včetně jeho základních přepínačů a také byste měli znát nástroj make pro automatizaci překladu programů v jazyku C/C++.

Dále je pro absolvování cvičení nutné mít přehled o systémových voláních fork, pipe, dup, open, kill, wait a execve, tzn. měli byste vědět, jak vzniká nový proces a jak lze přesměrovat standardní vstup a výstup. Potřebné informace se dozvíte na některé z předchozích přednášek.