Resili jsme ulohu addRFC :
Mate promennou DIR (klidne environmentovou), ve ktere je ulozena cesta ke slozce s RFC. (RFC je cosi jako specifikace)
V te slozce slozce jsou soubory rfc-index.txt, my-index.txt, rfc*.txt
rfc-index.txt: kompletni listing vsech RFC
Kód: Vybrat vše
0001 prvni RFC s cislem 1, muze byt i
na vic radku, kazdy dalsi zacina peti mezerami
a pokud existuje novejsi RFC, ktere tohle prepisuje, bude popis tohoto RFC obsahovat slova (Obsoleted by RFCn, RFCm...)
0002 dalsi RFC je oddeleno prazdnou radkou
0003 toto RFC je dalsi z rady
Kód: Vybrat vše
----- NAZEV_SEKCE:
0001 prvni RFC s cislem 1, muze byt i
na vic radku, kazdy dalsi zacina peti mezerami
a pokud existuje novejsi RFC, ktere tohle prepisuje, bude popis tohoto RFC obsahovat slova (Obsoleted by RFCn, RFCm...)
---- NAZEV_DRUHE_SEKCE:
0002 dalsi RFC je oddeleno prazdnou radkou
Jde o to, ze soubor my-index.txt by mel tak nejak korespondovat s pritomnymi rfc*.txt soubory. Chovat se to ma asi nasledovne:
Uzivatel si stahne nove rfc*.txt soubory z netu do $DIR a spusti skript s prislusnou optionou. Skript se podiva na zadane soubory, pro kazde RFC, pro ktere nema zaznam v my-index.txt se usera zepta, do ktere sekce zaradit (a pokud zadana neexistuje, pta se dokola, dokud se netrefi na existujici; zadanou sekci si pro pristi dotazy zapamatuje jako default), najde odpovidajici zaznam v rfc-index.txt a prekopiruje ho na prislusne misto v my-index.txt. RFCcka v jednotlivych sekcich musi byt serazena vzestupne podle cisla RFC. Pokud zaznam v my-index.txt existoval, jen ho updatuje.
Nebo muze uzivatel nejake rfc*.txt smazat a pak pustit skript s optionou, aby zkontroloval obsah dane sekce. Skript projde sekci, zkusi pro kazde RFC v ni najit prislusny soubor. Pokud ho najde, jen updatuje zaznam oproti rfc-index.txt, pokud soubor nenajde, zepta se, zda zaznam smazat.
Pozadovane optiony byly:
* -s sekce -> zkontroluje obsah jedne sekce
* -f file1 file2 ... -> zkontroluje, zda pro zadane soubory existuji zaznamy
* -r rfc1,rfc2-rfc6,rfc7... -> zkontroluje, zda pro zadana RFC existuji zaznamy (a prislusne soubory, pokud soubor neexistuje, jen vypise hlasku) (tady pozor, user muze zadat i rozsah RFC - to je to s pomlckou)
* -n file -> zkontroluje, zda pro vsechny RFC soubory v $DIR novejsi nez file existuji zaznamy
* bez optionu -> nejdriv koukne, zda pro vsechny soubory v $DIR najde zaznamy a pak projde vsechny sekce a zkusi najit ke vsem RFC soubory
Kdykoli si skript sahne na RFC, ktere ve svem textu obsahuje, ze je obsoleted (viz vyse), skript ho zpracuje, ale vypise hlasku.
Nektere postrehy:
* cisla v rfc*.txt byla bez uvodnich nul (tj. napr. rfc33.txt), kdezto v indexech jsou s nima (0033)
* rfc-index.txt a asi i my-index.txt se pry nadherne parsoval pres awk, kde nastavite RS="", coz zpusobi, ze vam bude hazet jako jeden record cely blok oddeleny prazdnou radkou, coz je presne format tech souboru
* kdyz uz mam v ruce cely blok, nemuzu obsoletnost zjistit jednoduse sedem, ten se z viceradkovych vyrazu podela... ovsem kdyz sedu blok predzpracuju tr "
" " ", hned se na me smeje
* na zpracovani rozsahu u optiony -r se asi da pouzit seq, i kdyz na prednasce bylo receno, ze je nestandardni
Casu bylo presne vysvetleni zadani + 2 hodiny cistyho na psani. Pak 2 hodinky pauza a pak zacal byt zlej. Mel min. 15 minut prednasku na tema, jak se to nepovedlo, jaky tam lidi psali prasarny a tak... Docela to pozabijel, byly 4 jednicky, asi 2 dvojky, o trojce nevim, 4 lidi si vzal ustne a zbylych asi 8 - 10 vyhodil.
Muj osobni postreh - awk me nenapadlo, tak jsem to vsechno edoval. To bylo celkem smrtacky, ale dalo se to. Jen jsem zjistil nasledujici chovani edu, kdyz jsem si chtel oznacit jeden blok v rfc-index.txt: (v $1 mam cislo RFC s uvodnimi nulami)
Kód: Vybrat vše
echo '/^'"$1"'/,/^[0-9]\{4\}/ p' |ed "rfc-index.txt" 2>/dev/null
* v adresni casti oba regexpy matchnou ten samy radek (jo, holt by clovek chtel moc, kdyby mel po zpracovani prvni casti adresy hned zmenit aktualni radek)
* matchne o dva radky vic (coz by nevadilo, ale treba v pripade mazani uz to byl problem)
* musi se if-ama zkoumat, zda nejsme na konci souboru (a kdyz tohle zkusim do my-index.txt, tak i musim zkoumat, jestli neni za blokem nova sekce)
spravnejsi bude neco takovyho (a melo by se to obejit bez if-u, pokud si na konec rfc-index.txt hodite prazdnou radku)
Kód: Vybrat vše
echo '/^'"$1"'/;.,/^\s*$/^ p' |ed "rfc-index.txt" 2>/dev/null
* /^'"$1"'/; -> tenhle prikaz nastavi pro nasledujici adresni prikaz aktualni radek (dulezity je ten strednik)
* .,/^\s*$/^ -> tecka je za aktualni radek, ten uz mame nastaveny, pak si najdu prazdny radek a popojedu o jeden nahoru (to je ta ^ za adresou, nevedel jsem, ze to takhle jde kombinovat, ale jde... dokonce muze byt vic ^ za sebou)
Hodne stesti vsem ostatnim