====== Cvičení 3: Zpracování textu v shellu a regulární výrazy ====== ===== Domácí příprava ===== Nastudujte [[courses:b4b35osy:cviceni:material:text|použití regulárních výrazů a nástroje pro zpracování textu]] (alespoň zběžně **grep**, **sed** a **tr**): ===== Zadání úlohy ===== Vytvořte skript v jazyce BASH, podle následujících požadavků: * Skript bude mít příponu ''.sh''. * Skript bude akceptovat parametry podle následujícího vzoru ''skript.sh [OPTIONS] [FILE...]'' * Pokud není uveden žádný ''FILE'', skript bude číst data ze standardního vstupu a výstup bude vypisovat na standardní výstup. V textu níže označuje slovo ''FILE'' i data ze standardního vstupu. * U všech souborů ''FILE'' (může jich být více) předpokládá, že to jsou zdrojové soubory v jazyce C a provede na nich operace podle zadaných přepínačů. * Bude mít 4 přepínače určující funkci skriptu: ** ''-h'' vypíše stručnou nápovědu a ukončí skript. Kdykoliv je zadán, ostatní následující přepínače jsou ignorovány. ** ''-i '' provede změnu názvů souborů v direktivě ''#include'' ve všech souborech ''FILE'' tak, že '''' přidá na začátek názvu souboru. Uvažujte obě varianty direktivy ''#include'' – jak pro soubory z aktuálního adresáře (''"foo.h"'') tak pro systémové knihovny (''''). Například pro ''-i lib/'', bude ''#include "foo.h"'' změněno na ''#include "lib/foo.h"''. ** ''-r'' změní konvenci názvů funkcí použitých v souborech FILE (definice, deklarace a jejich volání). Pokud je název funkce tvořen slovy oddělenými jedním podtržítkem, odstraní podtržítka a pokud je následující znak písmeno změní ho z malého na velké. Jako slovo je považována kombinace malých písmen a číslic o jednom či více znacích. Například ''toto_je_funkce_2_priklad()'' se změní na ''totoJeFunkce2Priklad()''. Nebude se měnit: ''_func()'', ''_func_xy()'', ''sin_Cos()'', ''remove_allX()'' a ''internal__func()''. Předpokládejte, že mezi názvem funkce a levou závorkou není žádný komentář ani konec řádku. ** (nepovinné, 1 bod) ''-f '' v kombinaci s ''-r'' omezí refaktoring jen na funkce, jejichž jméno odpovídá regulárnímu výrazu ''''. (priklad: ''uloha2.sh -r -f '^my' *.c'' změní pouze názvy funkcí začínajících "my") ** při zadání přepínačů ''-i'' i ''-r'' skript vykoná obě funkce, bez těchto přepínačů skript soubor nezmění ** při zadání jiného přepínače skript vypíše nápovědu a skončí s návratovou hodnotou 1 * Všechny změny se provedou i uvnitř komentáře, nebo řetězce. * Předpokládejte, že zdrojové kódy je možné zkompilovat. * Není-li řečeno jinak, skript končí s návratovou hodnotou 0. ==== Poznámky k implementaci ==== * Pro řešení úlohy doporučujeme použít programy grep, sed a tr * Jak je definován identifikátor v C se můžete dočíst zde 'https://www.studytonight.com/c/keywords-and-identifier.php' * Změnu z malých písmen na velká provedete například příkazem ''sed 's/./\U&/' '' (viz [[https://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Command.html#The-_0022s_0022-Command|dokumentaci]]), nebo ''tr '[:lower:]' '[:upper:]' ''. * Standardní chybový výstup můžete použít pro výpis ladících hlášek (''echo >&2 ...'' nebo ''set -x'') ===== Materiály ===== [[courses:b4b35osy:cviceni:material:text|Regulární výrazy]] ===== 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 mít alespoň minimální povědomí o použití překladače **gcc** a jeho základních parametrech ([[courses:b4b35osy:cviceni:material:gcc|]]) Nastudujte si použití nástroje **make** pro překlad programu v jazyku C/C++: [[courses:b4b35osy:cviceni:material:make|]] 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 exec, 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.