Regulární výrazy Určeno pro VT1 zimní semestr Pavel Strapata Stránka 1
|
|
- Kryštof Horák
- před 8 lety
- Počet zobrazení:
Transkript
1 Regulární výrazy Určeno pro VT1 zimní semestr Pavel Strapata 2007 Stránka 1
2 OBSAH 1. ZNAKY Jednoduché výrazy Libovolný znak Ne až tak libovolný znak Speciální znaky 5 2. OPAKOVÁNÍ VÝRAZU Regulární výrazy versus žolíkové znaky Mechanika srovnávání Příliš hladové opakování 9 3. GREP A SPOL sed vi awk Perl OMEZENÝ POČET OPAKOVÁNÍ Nejpopulárnější opakovačky Pozice ZAPAMATUJ A VZPOMEŇ SI Použití při hledání Použití při nahrazování MODIFIKÁTORY Klasické a rozšířené regulární výrazy REGULÁRNÍ STROJE 23 Stránka 2
3 8. SPECIALITY PERLU Uvolněná syntax Drobnosti, které potěší Vyhlížení LITERATURA Přehledová tabulka 29 Regulární výrazy 29 Stránka 3
4 1.Znaky U nix bez regulárních výrazů je jako sex bez partnera/partnerky. Dá se to pouţívat, ale člověk o cosi zásadního přichází. Znalost regulárních výrazů vám dá do rukou mimořádně silný nástroj pro práci s textem. Jejich prostřednictvím můţete: vytahovat z textových dat údaje, které vás zajímají přetvářet je do podoby, kterou potřebujete vyhledávat a nahrazovat v textových editorech a dalších programech Zkrátka regulární výraz je univerzální pomocník při práci s textem. Pouţívá jej celá řada programů v Unixu. Umoţňují prohledávat soubory (grep, egrep), editovat je (sed, vi), analyzovat a vypočítávát zajímavé údaje (awk) či nabízejí plnohodnotný programovací jazyk, kde si můţete dělat, co vás napadne (Perl, Tk). Ale nebudeme se dlouho zdrţovat propagandou a vzhůru do díla Jednoduché výrazy Nejjednodušším regulárním výrazem je obyčejné písmeno - třeba r. Kdyţ se v textu hledá řetězec, který by tomuto regulárnímu výrazu vyhověl, hledá se jednoduše písmeno "r". Implicitně se (jak bývá v Unixu zvykem) rozlišují malá a velká písmena. Ve většině nástrojů však můţete tuto vlastnost vypnout. Jelikoţ i v těch nejjednodušších případech člověk zpravidla hledá slovo a ne jediné písmeno, lze regulární výrazy řetězit. Pouţijete-li regulární výraz root, představuje vlastně zřetězení čtyř elementárních jednopísmenných regulárních výrazů. Výsledkem je chování, které byste očekávali - v textu se bude hledat slovo "root". Vyhledávání jednoduchých slov je tou nejprimitivnější, ale zároveň nejčastější aplikací regulárních výrazů. Řekněme, ţe hledáte nejčerstvější soubory v aktuálním adresáři. Nevím jak vy, ale já v hlavě nenosím, jak se jmenuje volba příkazu ls, která zajistí uspořádání podle času. Takţe zadám man ls a následně si pomocí /time nechám vyhledat první výskyt slova "time". Nebudu-li spokojen, stisknu klávesu n a poskočím tak na další výskyt. Popsané hledání zaloţené na regulárních výrazech dovedou oba programy pouţívané obvykle pro zobrazování manuálových stránek (a řady dalších textů): more i less. Tyto programy zároveň ilustrují jeden obecný princip: regulární výraz se typicky vyhledává jako podřetězec v jednotlivých řádcích textu Libovolný znak Poměrně často dochází k situacím, kdy vám na určité části hledaného řetězce nezáleţí. Například chcete ve zdrojovém textu HTML stránky vyhledávat začátky buněk v tabulkách - Stránka 4
5 čili značky <TD> a <TH>. Aţ na třetí znak jsou oba řetězce shodné, takţe je lze vyhledávat jediným regulárním výrazem. Pouze je třeba říci, ţe na jeho třetím znaku nezáleţí. Tuto činnost obstará znak tečka (.). Při hledání jí vyhoví libovolný znak kromě konce řádku. Nelze ji však ignorovat - nějaký znak jí program vţdy musí přiřadit. Výše zmíněné hledání řetězců "<TD>" či "<TH>" obstará regulární výraz <T.>. Přesněji řečeno mu vyhoví libovolný čtyřznakový řetězec, který začíná "<T" a končí znakem ">" Ne až tak libovolný znak Pouţitím tečky zcela rezignujete na hodnotu příslušného znaku. V některých případech se to hodí, jindy byste však potřebovali výběr omezit přísněji. Pak můţete sáhnout po hranatých závorkách. Zapíšete-li do hranatých závorek skupinu znaků, bude tomuto regulárnímu výrazu vyhovovat právě jeden z těchto znaků. Například výrazu [xyz] vyhoví buď znak "x" nebo "y" nebo "z". Jestliţe povolené znaky tvoří interval, můţete si ušetřit práci a v hranatých závorkách uvést pouze jeho meze, které spojíte pomlčkou. Pro vyhledání libovolné číslice poslouţí regulární výraz [0-9]. Předchozí hledání <TD> a <TH> bylo příliš benevolentní, protoţe za T povolovalo libovolný znak. Lepší je regulární výraz <T[DH]>, který se skutečně omezí jen na uvedené dvě značky. Jednotlivých znaků a jejich intervalů můţete do hranatých závorek napsat, co hrdlo ráčí. Například výrazu [a0-9zl-nt] vyhoví libovolné z písmen a, l, m, n, t, z nebo libovolná číslice. Kromě pomlčky se v hranatých závorkách vyskytuje ještě jeden speciální znak. Pokud hned za otevírací hranatou závorkou zapíšete stříšku (^), bude celá skupina negována. To znamená, ţe regulárnímu výrazu vyhoví libovolný znak odlišný od těch, které jsou uvedeny ve skupině. Například [^0-9] vyhoví cokoli kromě číslice. Intervaly znaků vycházejí z kódování ASCII. To znamená, ţe například výrazu [a-z] vyhoví libovolné malé písmeno anglické abecedy. Doplnit velká písmena není ţádný velký problém ([a-za-z]), ale s českými znaky je potíţ. V některých programech najdete konstrukce, kterým vyhoví i znaky české abecedy, univerzálně platné elegantní řešení však neexistuje Speciální znaky Moţná uţ vás napadlo "ale co kdyţ potřebuji vyhledat tečku?" Tedy obecněji: jak vyřadit speciální význam některých znaků. Obecná odpověď na tuto otázku zní "zpětným lomítkem". V Unixu bývá zvykem, ţe pokud speciálnímu znaku předřadíte zpětné lomítko, vypnete tak jeho speciální chování (a v některých případech právě naopak, jak uvidíte později). Celkem pohledný regulární výraz \.\.\. hledá tři tečky. Chcete-li vyhledat písmeno uzavřené v hranatých závorkách (tedy cosi jako "[x]"), pouţijte \[[a-z]\]. Stránka 5
6 Uvnitř hranatých závorek panuje specifické prostředí. Tečka zde představuje obyčejnou tečku a význam ostatních dvou speciálních znaků lze potlačit prostým pořadím. Stříška představuje negaci jen pokud je uvedena na samotném začátku a pomlčka slouţí jako oddělovač intervalu jen pokud má z obou stran jeho meze. Takţe například výrazu [.^az-] vyhoví pouze jeden ze znaků ".", "^", "-", "a" nebo "z". Pokud má být jedním z povolených znaků pravá hranatá závorka, uveďte ji hned za otevírací. Takţe například regulárnímu výrazu [][] vyhoví levá nebo pravá hranatá závorka. Pokud byste znaky uvnitř vnějších hranatých závorek zapsali v opačném pořadí ([[]]), význam by se radikálně změnil: byl by interpretován jako [[] bezprostředně následované ]. Čili vyhověl by mu jedině řetězec "[]". V předchozí části jsem popsal základní prvky regulárních výrazů. Konstrukce, které jsem z nich vytvářel, měly jednu společnou nevýhodu: pevně daný počet znaků hledaného řetězce. V dnešní části se budu věnovat mechanismu opakování. Díky němu lze zajistit, ţe řetězec odpovídající regulárnímu výrazu můţe mít proměnlivou délku. Stránka 6
7 2.Opakování výrazu Z ákladní konstrukcí pro opakování regulárních výrazů je hvězdička (*). Znamená, ţe regulární výraz bezprostředně před ní se můţe zopakovat, kolikrát to jenom jde. Výrazu A* tedy vyhoví libovolný počet písmen "A", zatímco [0-9]* ztělesňuje libovolně dlouhou posloupnost číslic (opakovaným regulárním výrazem je zde [0-9], tedy libovolná číslice). V řadě programovacích jazyků je identifikátor definován jako libovolně dlouhá posloupnost písmen a číslic začínající písmenem. Pomocí regulárního výrazu bychom jej zapsali jako [aza-z][a-za-z0-9]*. Zdůrazňuji, ţe opakování se týká jen regulárního výrazu, který je uveden bezprostředně před hvězdičkou. Uvedený výraz tedy znamená "právě jeden výskyt [a-za-z] (písmeno), za nímţ následuje libovolný počet výskytů [a-za-z0-9] (písmeno nebo číslice)". Snad nejběţnějším opakovaným výrazem je tečka, která v kombinaci s hvězdičkou (.*) znamená "libovolný řetězec znaků". V souvislosti s opakováním si dobře zapamatujte tři důleţité skutečnosti: do libovolného počtu opakování se počítá i nula opakování se týká regulárního výrazu, nikoli řetězce, který je s ním porovnáván opakování je hladové - snaţí se "pozřít" co nejvíc znaků Přípustnost nulového počtu opakování znamená, ţe opakovanému regulárnímu výrazu vţdy můţe vyhovět i prázdný řetězec. Praktickým důsledkem je, ţe jen vzácně dává smysl vyhledávat samotný opakovaný výraz. Zpravidla je třeba jej alespoň z jedné strany ohraničit něčím povinným. Chcete-li vyhledat v textu všechna čísla, nemá smysl hledat "libovolně dlouhou posloupnost číslic" ([0-9]*), protoţe posloupnost číslic nulové délky obsahuje kaţdý řádek (vyzkoušejte grep '[0-9]*' soubor na libovolný soubor - uvidíte, ţe "najde" všechny jeho řádky). Správně je třeba hledat "alespoň jednu číslici", tedy pouţít regulární výraz [0-9][0-9]*. Skutečnost, ţe opakování se týká regulárního výrazu, nikoli srovnávaného řetězce, je velmi důleţitá. Zapíšete-li.*, spojujete dva prvky: symbol pro libovolný znak a symbol opakování. Výslednou konstrukci lze chápat dvěma způsoby. Buď jako libovolný počet libovolných znaků (opakování regulárního výrazu) nebo ţe v textu můţe být libovolný znak a ten se pak můţe opakovat, kolikrát chce (opakování ve zkoumaném řetězci). Správný je první výklad, jinak bychom se z toho nejspíš zbláznili. Hladovost opakování se projevuje tím, ţe opakovaný regulární výraz se vţdy snaţí roztáhnout na co největší délku - zahrnout do sebe co největší počet znaků zkoumaného řetězce. Proto kdyţ například řetězec "brambora" srovnáte s regulárním výrazem r.*a (libovolný řetězec znaků začínající "r" a končící "a"), bude vyhovujícím řetězcem "rambora" (od prvního "r" aţ po poslední "a"). Stránka 7
8 2.1. Regulární výrazy versus žolíkové znaky Začátečníci někdy zaměňují regulární výrazy s ţolíkovými znaky. Jistá podobnost tu skutečně je - oba prostředky umoţňují vytvářet jakési vzory, které jsou porovnávány se skutečnými daty. Existují mezi nimi dva zásadní rozdíly. Ţolíkové znaky se týkají názvů souborů a zpracovává je interpret příkazů (shell). Naproti tomu regulární výrazy se zaobírají obsahem (textových) souborů a jejich interpretaci mají na starosti jednotlivé programy (editory, grep a podobně). Případným omylům ještě nahrává podobnost některých speciálních znaků mezi oběma konstrukcemi. V tomto směru je záhodno především mít na paměti, ţe zatímco v ţolíkových znacích * představuje libovolný řetězec, v regulárních výrazech se libovolný řetězec zapisuje pomocí.* Mechanika srovnávání Pojmem srovnávání (matching) se označuje proces, kdy program hledá, zda předloţený řetězec znaků odpovídá regulárnímu výrazu či nikoli. Zároveň se program snaţí stanovit, které části řetězce odpovídají jednotlivým částem regulárního výrazu. Dokud se zabýváte pouze hledáním, je pro vás v podstatě nezajímavé, kde přesně byl daný vzor nalezen. Ovšem kdyţ pouţíváte regulární výrazy k nahrazování (a právě v tom je jejich největší síla), je tato informace velmi důleţitá. Základní princip srovnávání je následující: začne se od začátku řetězce. Kaţdému prvku regulárního výrazu se snaţí přiřadit vţdy co nejdelší posloupnost znaků ze zkoumaného textu a teprve pak pokračuje srovnáváním dalších částí. Pokud to později nevyjde, vrátí se zpět a zkusí přidělený řetězec o jeden znak zkrátit. Jestliţe jiţ zkrátil na minimum vše, co zkrátit šlo, a přesto se nepodařilo najít shodu, posune se na další znak zkoumaného textu a vše se rozjede znovu. Podívejme se, jak by vypadalo srovnávání regulárního výrazu r.*[0-9]*o s řetězcem "Brambory jsou na poli". Při hledání by postupoval takto: Stránka 8
9 5. Z příkladu je vidět, ţe díky své hladovosti regulární výraz zabere co největší část řetězce - od prvního "r" aţ po poslední "o". Výrazu.* je nakonec přiřazen řetězec "ambory jsou na p". Výrazu [0-9]* srovnávání přidělí prázdný řetězec. Zdánlivě proto, ţe zkoumaný text neobsahuje ţádné číslice. Ve skutečnosti však řetězec odpovídající tomuto výrazu zůstane prázdný vţdy, protoţe je umístěn nesmyslně. Předchází mu totiţ obecnější regulární výraz s opakováním. Jakýkoli znak, který by mohl vyhovovat [0-9]* vyhovuje také předchozímu.*, které jej díky své hladovosti seţere a na [0-9]* nezbyde nic. Ze stejného důvodu kdyţ libovolný řetězec znaků srovnáte s regulárním výrazem.*.*, bude prvnímu.* přiřazen celý zkoumaný řetězec a druhému.* prázdný řetězec Příliš hladové opakování Na hladovost opakování je třeba si dávat pozor. Díky ní se snadno můţe stát, ţe opakující se výraz pohltí i ty znaky, se kterými jste nepočítali. Klasickým příkladem tohoto chování je regulární výraz pro řetězec znaků v uvozovkách. Začátečníci mají často tendenci uvaţovat následovně: řetězec v uvozovkách, to jsou otevírací uvozovky, pak cokoli a na konci druhé uvozovky. To vyjádříme regulárním výrazem ".*". Problém je, ţe díky hladovosti hvězdičky se tento regulární výraz roztáhne od prvních uvozovek ve zkoumaném řetězci aţ po poslední. Takţe například kdyţ jej vypustíte na řetězec 'Volali "Ahój" a "Nazdár".', dopadne to takto: Řešením je nepřipouštět v uzavřeném řetězci libovolné znaky, ale pouze znaky jiné neţ koncový. V našem případě cokoli kromě uvozovek, takţe tím správným regulárním výrazem bude "[^"]*": Mimochodem - kdybyste na řetězec aplikovali výraz.*".*", roztáhne se první.* na 'Volali "Ahój" a ' a druhé.* na 'Nazdár'. Jelikoţ jsou v regulárním výrazu povinné uvozovky, nemůţe první.* schramstnout všechno. Ukousne si však co nejvíc, čímţ druhé.* omezí na minimum. První dvě části našeho krátkého seriálu se zabývaly těmi nejzákladnějšími prvky regulárních výrazů. Přestoţe jsem například v oblasti opakování ještě zůstal dost dluţen, rozhodl jsem se udělat malou přestávku a věnovat se programům, které regulární výrazy pouţívají. Dnes se tedy pokusím popsat, co a jak se s nimi dá provádět. Stránka 9
10 3.grep a spol. R odina programů *grep slouţí k vyhledávání v souborech. Typické pouţití: hledáte určitý identifikátor v haldě zdrojových kódů nebo chcete zjistit, odkud se spouští určitý program. Spuštění je prosté: grep vzor seznam_souborů Vzorem je regulární výraz. Výstup programu tvoří řádky, které vyhovují zadanému vzoru (coţ nejčastěji znamená, ţe obsahují zadané slovo). Pokud program zkoumá více neţ jeden soubor, vypíše zároveň před kaţdý řádek název souboru, ze kterého pochází. Prostřednictvím voleb lze ovlivnit jeho chování. Těmi nejběţnějšími jsou: -i nerozlišovat malá písmena od velkých -w vybírat jen řádky, na nichţ vzoru vyhovuje celé slovo -v negovat výsledek (vypisovat řádky, které nevyhovují vzoru) -l vypisovat jen jména souborů -r rekurzivně procházet adresáře (umí jen některé verze grepu) grep je představitelem celé rodinky programů. Mají podobná jména i funkci, liší se jen v detailech. Jejími standardními členy jsou tyto tři programy: grep klasický grep, vzorem můţe být obyčejný regulární výraz egrep vzorem je rozšířený regulární výraz (viz příště), pouţívá rychlejší vyhledávací algoritmus fgrep vzorem je jen obyčejný řetězec znaků; teoreticky nejrychlejší, ale praktická měření ukazují opak; zapomeňte na něj Kromě nich existují ještě některé další pozoruhodné alternativy. Asi nejzajímavější je agrep (approximate grep) vyhledávající řetězce, které se zadanému vzoru pouze podobají. Najde například nejpodobnější nebo všechny takové, které se od vzoru liší jen v daném počtu znaků. Vřele doporučuji pouţívat grep a spol. pocházející z GNU projektu. Ve srovnání s klasickými implementacemi je rychlejší (pouţívá lepší algoritmy) a navíc umí některé příjemnosti (třeba rekurzivní hledání). Zejména komerční verze Unixu však mají tendenci trvat na originálních verzích. Proto vyzkoušejte grep --version Dostanete-li chybové hlášení nebo se ohlásí někdo jiný neţ GNU grep, máte co instalovat sed Program sed je neinteraktivní editor. Zadáte mu sadu příkazů a on podle nich zpracuje vstupní text. De facto se jedná o nástroj pro vytváření editačních filtrů. Stránka 10
11 Regulární výrazy se v sedu vyskytují hned ve dvojí roli. Lze je pouţít k vyhledání řádků, na které se má vztahovat určitý příkaz. Druhým místem výskytu regulárních výrazů je příkaz pro nahrazování, který má tvar s/vzor/náhrada/. Vyhledává regulárním výrazem zadaný vzor a pokud jej najde, vloţí na jeho místo náhradu. Za závěrečné lomítko můţete připojit ještě volby. Tou nejpouţívanější je g (global), která zajistí nahrazení všech výskytů vzoru na řádku. Standardně se totiţ nahrazuje jen první. Příkazy sedu mají obecně tvar řádky příkaz Počáteční definice řádků určuje, na které řádky vstupního textu se příkaz bude vztahovat (chybí-li, znamená to všechny řádky). Řekněme, ţe jste změnili doménu z kdesi.cz na jinde.cz. Navíc chcete ze svých WWW stránek odstranit pracovní texty - tedy veškeré úseky začínající <div class="pracovni"> a končící </div>. Zajistí to následující dvojice příkazů: s/kdesi\.cz/jinde\.cz/g /<div class="pracovni">/,/<\/div>/d První je klasické nahrazení, které se bez určení řádků vztahuje na celý vstupní text. Druhým příkazem je d (delete), kterému podlehnou všechny skupiny řádků od řádku vyhovujícího prvnímu regulárnímu výrazu aţ po nejbliţší následující, který vyhovuje druhému. Všimněte si, ţe lomítko v </div> je třeba chránit zpětným lomítkem, protoţe v příkazu s má speciální funkci oddělovače. Tuto dvojici uloţíte řekněme do souboru zmena a kaţdou stránku pak podrobíte příkazu sed -f zmena Příklad tiše předpokládá, ţe své HTML stránky píšete stejně jako já - tedy ţe značky <div> a </div> jsou na samostatném řádku. Pokud ne, vezme při mazání za své celý řádek, který některou z nich obsahuje vi Unixové textové editory, jejichţ je vi nejklasičtějším představitelem, typicky pouţívají regulární výrazy k vyhledávání textu a také k jeho nahrazování. Konkrétně v případě vi zahajujete hledání stisknutím klávesy /, případně? (pokud chcete hledat směrem k začátku dokumentu). Následně napište regulární výraz a stiskněte [Enter]. Kurzor poskočí na nejbliţší následující/předchozí řetězec vyhovující zadanému výrazu. Chcete-li se přesunout na další, stiskněte n (next) pokud chcete hledat stejným směrem či N pro hledání směrem opačným. Čili úplně stejně jako v programech more a less. V kombinaci s tečkou (opakování poslední editační operace) tvoří n pořádně silnou dvojku. Pomocí n si poskakujete na další a další výskyty hledaného řetězce a tu a tam na některý zopakujete editační operaci stisknutím tečky. Stránka 11
12 Příkaz pro nahrazení má stejnou podobu, jako u editoru sed. Jediným rozdílem je, ţe pokud neuvedete řádky, implicitně se týká pouze aktuálního řádku. Chcete-li nahradit vzor v celém textu, pouţijte jako definici řádků znak %. Nahrazování patří do příkazového reţimu, takţe celý příkaz musíte zahájit dvojtečkou. Výše zmiňovanou náhradu kdesi.cz na jinde.cz by ve vi zajistil příkaz :%s/kdesi\.cz/jinde\.cz/g Některé verze vi určené pro grafické prostředí (například gvim) nabízejí i uţivatelsky přítulnou verzi tohoto příkazu - viz obrázek. Ortodoxní uţivatel o ni samozřejmě nezavadí ani pohledem, protoţe 1. Musí-li pracovat v textovém reţimu nebo na jiném počítači, nebude tato lahůdka k dispozici. 2. :s je rychlejší a u novějších implementací vi máte navíc historii příkazů. 3. Jen při pouţívání :s vypadáte jako skutečný borec. Pokud pouţíváte vim, můţete k vyznačení řádků s výhodou vyuţít vizuální reţim. Stiskněte klávesu v a zvýrazněte poţadované rozmezí řádků. Kdyţ potom stisknete :, editor automaticky vloţí podivné rozmezí řádků '<,'>, coţ znamená od prvního vyznačeného řádku po poslední. Pozor, nahrazení se týká celých řádků, ne jen vyznačeného textu v nich. Ostatní editory nabízejí zpravidla podobné sluţby, liší se jen příkazy, kterými je vyvoláváte awk Program awk realizuje specializovaný programovací jazyk, který umoţňuje zpracovávat textové soubory s pevnou strukturou (např. /etc/passwd, výstup příkazu ls -l a podobně). Regulární výrazy opět vystupují ve dvou známých rolích: určují řádky, kterých se operace týká, a vyskytují se v nahrazování. Základním problémem awku je jeho jednostrannost. Syntaktický tvar programů je velmi nezvyklý a drţet jej v hlavě kvůli úzce vymezené skupině úloh, které dokáţe řešit, se podle mého soudu nevyplatí Perl Stránka 12
13 Perl je pozoruhodný programovací jazyk, který z hlediska regulárních výrazů nabízí dvě vysoce zajímavé vlastnosti: 1. Má nejbohatší a nejpřehlednější sortiment regulárních výrazů ze všech mně známých nástrojů. 2. Spojuje regulární výrazy s běţnými programátorskými konstrukcemi a la C. Ve srovnání s Perlem vám sed či awk nemají mnoho co nabídnout. V poslední době pro neinteraktivní úpravy textů nepouţívám nic jiného. Základní konstrukcí pro uplatnění regulárních výrazů v Perlu je operátor srovnání (=~). Jeho levým operandem je řetězec znaků (typicky proměnná). Pravý operand závisí na tom, co s dotyčným řetězcem hodláte provádět. Pokud vám jde o prosté srovnání, zda řetězec vyhovuje regulárnímu výrazu, zapíšete sem obvyklý vzor uzavřený mezi dvě lomítka. Perl je velmi košatý a lze jej pouţívat mnoha různými způsoby. Začnu s minimalistickou variantou, kdy prováděný "program" píšete přímo do příkazového řádku. V tomto případě se Perl pouţívá s volbou -e, která způsobí, ţe následující text bude interpretován rovnou jako příkazy jazyka. Zpravidla bývá kombinována s volbou -n, díky níţ budou příkazy prováděny pro kaţdý řádek vstupního textu. Takţe třeba perl -ne 'print if /Pepa/' vypíše ty řádky vstupního textu, které obsahují řetězec "Pepa". Zároveň zde Perl demonstruje skutečnost, ţe si dokáţe hodně věcí domyslet (chybí zde proměnná i operátor srovnání). Já osobně se však této domýšlivosti raději straním. Následuje serióznější úryvek z programu. Vypíše hlášení, zda proměnná $radek obsahuje podřetězec "Pepa". if ( $radek =~ /Pepa/ ) { print "Je tam!"; } else { print "Není tam..."; } Chcete-li pouţít regulární výraz k nahrazení řetězce jiným, uveďte na pravé straně srovnání obvyklou substituční konstrukci s/vzor/náhrada/. A ještě jeden kondenzát. Následující volání nahradí ve vstupním textu všechna čísla (celá čísla, nikoli jednotlivé číslice!) znakem "X": perl -pe 's/[0-9][0-9]*/x/g' Pouţitá volba -p se podobá -n, ale po provedení příkazů navíc pošle aktuální řádek na standardní výstup. Všimněte si apostrofů, kterými jsou obklopeny regulární výrazy a příkazy na příkazovém řádku. Zajišťují, ţe je interpret příkazů předá v nezměněné podobě volanému programu a nebude se snaţit interpetovat je jako své speciální znaky. Stránka 13
14 V programech se substituce zpravidla pouţívá takto: $radek =~ s/[0-9][0-9]*/x/g; Zde se nahrazuje v obsahu proměnné $radek. Jak vidíte, pouţití regulárních výrazů na proměnné obsahující řetězce znaků je v Perlu velmi snadné. Zajímavé sluţby nabízí také funkce split(/vzor/,řetězec), která řetězec znaků rozdělí na části ohraničené výskyty zadaného regulárního výrazu. Ideální pro zpracování souborů, jako je /etc/passwd. Po krátké odbočce se vracíme k opakování. Onu přestávku věnovanou programům podporujícím regulární výrazy jsem zařadil jednak abych předvedl nějaké praktické vyuţití, jednak proto, ţe jiţ nebude moţné skrývat existenci různých dialektů. Různé programy totiţ podporují lehce odlišné varianty regulárních výrazů. Ty, o kterých jsem mluvil aţ dosud, byly společné pro všechny. Dnes uţ narazíme na některé odlišnosti. Stránka 14
15 4.Omezený počet opakování Z ákladním problémem klasické opakovací hvězdičky je, ţe je nekontrolovatelná. Pro některé situace potřebujete přesnější vyjadřování. Vaše touhy uspokojí konstrukce \{min,max\}. Opět se vztahuje na bezprostředně předcházející regulární výraz a říká, ţe se má opakovat alespoň min-krát, nanejvýš však maxkrát. Jako kaţdé opakování i tohle je hladové, takţe se snaţí uplatnit vţdy co největší z povoleného počtu opakování. Regulárnímu výrazu i\{1,3\} vyhoví řetězce "i", "ii" nebo "iii". Tvar tohoto opakovátka je velmi variabilní. Pokud chybí horní mez (\{min,\}), znamená to, ţe maximální počet opakování je neomezený. Jestliţe v konstrukci pouţijete jen samotné číslo (\{počet\}), musí se regulární výraz opakovat přesně daný počet-krát. Regulární výraz pro rodné číslo by vypadal takto: [0-9]\{6\}/[0-9]\{3,4\} Šest číslic, lomítko a ještě tři nebo čtyři číslice. A jiţ tu máme první odlišnost. V některých verzích regulárních výrazů (například v Perlu) se při omezování počtu opakování před sloţenými závorkami nepíší zpětná lomítka. Zapíšete-li zde \{, znamená to, ţe zkoumaný text má obsahovat znak "{". Perl má pro tuto specialitu dobrou omluvu: zavedl pravidlo, ţe kombinace zpětného lomítka a znaku odlišného od písmena či číslice nikdy nemá speciální význam a vţdy představuje dotyčný znak Nejpopulárnější opakovačky Dva velmi populární případy opakování si vyslouţily svůj vlastní speciální znak. Prvním je "alespoň jeden výskyt" - tedy cosi velmi podobného klasické opakovací hvězdičce, aţ na to, ţe opakovaný regulární výraz nelze vynechat. Stejného efektu dosáhnete konstrukcí \{1,\}, ale to je příliš sloţité psaní. Proto se alespoň jeden výskyt předchozího regulárního výrazu zapisuje znakem plus (+). Druhou populární situací je nepovinný (čili nanejvýš jeden) výskyt. Opět jej lze zapsat pomocí \{0,1\}, ale kratší je otazník (?). Dialekty regulárních výrazů se u této dvojice znaků opět silně rozcházejí. Programy pouţívající klasické regulární výrazy (grep, sed, vi) jim předřazují zpětné lomítko (\+ a \?). Generace, která implementuje rozšířené regulární výrazy, (egrep, awk, Perl) je píše bez něj (+ a?). Stránka 15
16 Alespoň jedna číslice se tedy v grep, sed a vi vyjádří pomocí [0-9]\+, zatímco egrep, awk či Perl nabízí kratší [0-9]+. Zápis můţeme lehce rozšířit na regulární výraz pro celé číslo: nepovinné znaménko následované alespoň jednou číslici. V klasických regulárních výrazech to bude [-+]\?[0-9]\+, zatímco v rozšířených [-+]?[0-9] Pozice Výrok "dejte mi pevný bod a pohnu zeměkoulí" jistě znáte. Nahlíţeno jeho optikou byly všechny naše dosavadní regulární výrazy poněkud neukotvené. Řetězec, který jim vyhovuje, se mohl vyskytovat kdekoli ve zkoumaném textu. Občas však člověk musí být přísnější. Proto regulární výrazy nabízejí několik speciálních pozičních znaků. Těmi nejznámějšími jsou stříška (^), která ztělesňuje začátek řádku (resp. zkoumaného řetězce znaků), a dolar ($) označující jeho konec. grep '^#' vám tedy najde řádky začínající znakem '#', grep '[0-9]$' řádky končící číslicí a konečně grep '^-\+$' řádky sloţené pouze z pomlček (nikoli však prázdné). Dalším významným místem je hranice slova. Ve většině regulárních dialektů máte k dispozici konstrukci \<, která označuje začátek slova, a \>, které vyhoví pouze jeho konec. Perl nerozlišuje začátek slova od konce, má pouze speciální znak \b pro "hranici slova" (tedy začátek nebo konec). Ovšem dluţno přiznat, ţe z okolního kontextu bývá zřejmé, zda \b můţe vyhovět začátek nebo konec slova. Jako cenu útěchy získáváte v Perlu ještě \B, kterému vyhoví libovolné místo ve zkoumaném řetězci kromě hranice slova. Jedná se tedy o negaci \b. Zajímají-li vás všechny řádky, na nichţ se písmeno 'a' vyskytuje v roli jednopísmenné spojky, nasaďte grep '\<a\>' Totéţ v Perlu (aţ na to, ţe se nevypisují jména souborů) by zajistil příkaz perl -ne 'print if /\ba\b/' Pokud se názvů souborů nehodláte vzdát, pouţijte perl -ne 'print "$ARGV:$_" if /\ba\b/' Na pátou část seriálu jsem si pošetřil snad nejsilnější prvek regulárních výrazů - jejich paměť. Regulární výraz si totiţ dokáţe zapamatovat řetězec, který vyhověl jeho části, a později jej pouţít. Největší sluţby tento mechanismus odvede při nahrazování. Stránka 16
17 5.Zapamatuj a vzpomeň si P rostředky pro zapamatování jsou směšně jednoduché. Část, kterou si má regulární výraz podrţet v paměti, prostě ohraničíte konstrukcemi \( a \). Jistě si vzpomínáte, ţe v Perlu nemá nealfanumerický znak předcházený závorkou nikdy speciální význam, takţe tam se ke stejnému účelu pouţívají obyčejné závorky. Takových úseků můţete v regulárním výrazu mít hned několik. Dokonce je lze i vzájemně vnořovat. Kdyţ později chcete pouţít zapamatovaný řetězec, napište \číslo, kde číslo je pořadové číslo zapamatovaného úseku. Pořadová čísla začínají jedničkou a rozhoduje o nich pořadí levé (otevírací) závorky zapamatovávané sekvence. Podrobíte-li řádek ze souboru /etc/passwd regulárnímu výrazu ^\([^:]*\):[^:]*:\([^:]*\), bude \1 obsahovat přihlašovací jméno a \2 jemu odpovídající identifikátor (UID). O dobrodiní paměti jste ochuzeni u programů egrep a awk. Jejich algoritmus pro srovnávání regulárních výrazů nepodporuje zapamatování (a z principiálních důvodů ani podporovat nemůţe). V příští části se k této otázce vrátím podrobněji Použití při hledání Pouţití zapamatovaných částí při vyhledávání je poměrně vzácné. Řečeno mluvou politiků: společenská potřeba takové sluţby je celkem malá. Příklady sice existují, nicméně bývají takové školometské. Tak si nějaké zkusíme. Hezkou a zcela neuţitečnou ilustrací zapamatování je hledání palindromů (slov, která se nezmění, kdyţ je čtete pozadu). Tak například výrazu \<\(.\)\(.\).\2\1\> vyhoví právě a pouze pětiznakový palindrom (např. radar či rotor). První dva znaky slova si zapamatuje, za nimi následuje třetí libovolný znak, čtvrtý musí být stejný jako zapamatovaný druhý a pátý znak se musí shodovat s prvním. Zkusím něco, co by alespoň vzdáleně připomínalo reálný ţivot. Řekněme, ţe máte výstupy z jakéhosi algoritmu - na kaţdém řádku sadu čísel oddělených mezerami. Kaţdý řádek zároveň končí správným výsledkem. Pokud algoritmus pracuje správně, poslední dvě čísla na řádku jsou totoţná. Hledáme tedy řádky, ve kterých se poslední číslo liší od předposledního. K řešení poslouţí grep s negovanou podmínkou (volba -v): grep -v ' \([^ ]\+\) \+\1$' Stránka 17
18 Vzor začíná mezerou před předposledním číslem. Za ní následuje neprázdná posloupnost nemezerových znaků ([^ ]\+), která se zapamatuje. Po ní následuje alespoň jedna mezera ( \+) a znovu stejná posloupnost, za kterou uţ je jen konec řádku Použití při nahrazování Daleko častěji se zapamatované řetězce vyskytují v příkazech pro nahrazování. Díky nim si můţete ze vstupních dat vytáhnout informace, které vás zajímají, a poskládat si je do tvaru, který potřebujete. Běţný problém všedního dne: potřebujete u skupiny souborů změnit příponu z.htm na.html. Pro podobné účely sice existují různá udělátka, ale je třeba si je doinstalovávat a práce s nimi nebývá úplně snadná. takţe se podívejme, jak poslouţí standardní nástroje, které najdete v kaţdém Unixu. Postup je jednoduchý: obstaráte si seznam jmen souborů, kaţdé jméno pak změníte na příkaz mv staré nové a tyto příkazy provedete. Popsaný postup lze realizovat třeba takto: ls *.htm > seznam sed 's/\(.*\)/mv \1 \1l/' seznam > akce chmod a+x akce./akce rm seznam akce Uznávám, ţe prosté připojení "l" na konec jména souboru je dosti snadnou modifikací. Sloţitější věci však znamenají jen úpravu příkazu s. Například změnu přípony z.doc na.txt by zajistilo s/\(.*\)\.doc/mv \1.doc \1.txt/ - zapamatuje si jen vlastní jméno souboru a přípony jsou explicitně vyjmenovány. A teď něco drsnějšího. Chtěl bych ze souboru /etc/passwd vyrobit seznam domácích stránek uţivatelů. Takţe potřebuji řádky transformovat z původní podoby uživatel:heslo:uid:gid:vlastní jméno:... na <a href="/~uživatel">vlastní jméno</a> Kýţeným substitučním příkazem, který to zařídí, je s/\([^:]*\):\([^:]*:\)\{3\}\([^:]*\).*/<a href="/~\1">\3<\/a>/ Jak vidíte, prostřednictvím závorek lze předepsat počet opakování i rozsáhlejšímu úseku regulárního výrazu - zde se třikrát opakuje skupina [^:]*:. V takovýchto situacích závorky většinou neslouţí k zapamatování (i kdyţ si pochopitelně něco zapamatují), ale čistě k vymezení opakované části. Ta má - bez ohledu na skutečný počet opakování - jen jediné pořadové číslo. Proto se závěrečné zapamatované jméno uloţí jako \3. Stránka 18
19 Problémem regulárních výrazů je, ţe jsou velmi kompaktní. Vyznat se ve výše citovaném substitučním příkazu zabere chvíli času (zpravidla více, neţ jej vymyslet). V Perlu si můţete vytvoření seznamu rozloţit: nejprve řádek rozkrájíte v místě výskytu dvojteček a z výsledného pole pak pouţijete první a pátý prvek (indexy 0 a 4): while ( $radek = <> ) = split(/:/, $radek); print "<A HREF=\"/~$uzivatel[0]\">"; print "$uzivatel[4]</a>\n"; } Program uloţte třeba do souboru htmlseznam a spusťte perl htmlseznam /etc/passwd Od minula si umíte nalezené věci zapamatovat a později pouţít. To je v reálném ţivotě šeredně nebezpečná vlastnost. Například jste teď nepouţitelní jako voliči. Abyste se opět stali politicky korektními, naučím vás pozměnit, co jste si zapamatovali. Stránka 19
20 6.Modifikátory K dybych chtěl být protivně korektní, vlastně bych o modifikátorech neměl mluvit, protoţe oficiálně nepatří mezi regulární výrazy. Pouţívají se však v těsné součinnosti s nimi, takţe zpravidla bývají házeny do jednoho pytle. Modifikátory jsou konstrukce, které změní následující znaky. Jejich typické pouţití nese následující znaky: slouţí k vzájemnému převodu malých/velkých písmen vyskytují se ve druhé (nahrazující) části příkazu pro nahrazování řetězců bývají aplikovány na zapamatované řetězce. Těmi nejjednoduššími jsou \u a \l. První z nich převede následující znak z malého písmene na velké (upper case). Následuje-li cokoli jiného, neţ malé písmeno, zůstane znak beze změny. Konstrukce \l funguje právě opačně - převádí následující velké písmeno na malé (lower case). Uvedené modifikátory se týkaly vţdy jen jediného znaku, který následuje bezprostředně za nimi. Pokud pouţijete velké písmeno (\U či \L), zasáhne modifikátor všechny následující znaky aţ po konec řetězce nebo nejbliţší následující výskyt \E, kteráţto konstrukce slouţí jako ukončující. Bohuţel jsou modifikátory poměrně vzácné. grep a jeho bratři nedovedou nahrazovat, takţe u nich nemají smysl, nemá je sed ani awk. Z mnou běţně pouţívaných nástrojů nabízí modifikátory jen vim (jak je na tom klasické vi nevím) a Perl. Pokud pouţíváte něco jiného, je potřeba nahlédnout do dokumentace. A zase něco ze ţivota: vytvořili jste WWW stránky v prostředí MS Windows a následně je vystavili na Unixovém serveru. A nestačíte se divit. Část obrázků záhadně zmizela, nefungují dříve funkční odkazy a podobně. Příčina je v tom, ţe Unix a protokoly pohánějící WWW rozlišují malá písmena od velkých, zatímco MS Windows nikoli. Máte-li na stránku vloţen obrázek se jménem Image1.gif, ale soubor se ve skutečnosti jmenuje image1.gif, ve Windows vypadá vše v pořádku, ačkoli ve skutečnosti není. Řešení: je třeba sjednotit velikost znaků - nejlépe tak, ţe se vše převede na malá písmena. Takţe si vypíšete seznam souborů v adresáři se stránkami (raději pomocí find, aby výpis obsahoval i cesty do podadresářů), vychytáte ta jména, která obsahují velká písmena, a převedete je na malá: find. grep '[A-Z]' > seznam perl -pe 's/(.*)/mv \1 \L\1/' seznam > akce source akce rm seznam akce Stránka 20
21 Po provedení těchto příkazů máte soubory přejmenovány na malá písmena (druhý řádek není zcela korektní, vrátím se k němu na konci příkladu). Zbývá vypořádat se s odkazy na ně. Za nejschůdnější povaţuji vytvořit si konverzní program maleodkazy: #!/bin/sh for soubor in $* do perl -pei.bak 's/(href=)(['"][^'"]+['"])/\1\l\2/ig; s/(src=)(['"][^'"]+['"])/\1\l\2/ig' $soubor done V substitucích si všimněte, ţe kromě volby g (nahradit všechny výskyty) obsahuje i volbu i (ignorovat rozdíly mezi malými a velkými písmeny). Díky ní nezáleţí na tom, jakými písmeny jsou psány názvy atributů SRC a HREF. Zároveň jsem si je zapamatoval zvlášť a vystrčil před \L, aby velikost jejich písmen zůstala zachována. Volba -i.bak způsobí, ţe Perl soubor zpracuje "na místě" a zálohu jeho původního obsahu uloţí s příponou.bak. Program pak vypustíte na odpovídající soubory./maleodkazy *.html Jsou-li stránky i v podadresářích, bude zřejmě lepší vloţit jména souborů pomocí příkazu find uzavřeného ve zpětných apostrofech:./maleodkazy `find. -name \*.html` Avizoval jsem, ţe přejmenování souborů není zcela v pořádku. Bude zlobit, pokud se velká písmena vyskytnou ve jménech podadresářů, takţe pokud například aktuální adresář bude obsahovat soubor Abc/Def, vygenerují se příkazy mv Abc abc mv Abc/Def abc/def přičemţ v okamţiku provádění druhého jiţ adresář Abc neexistuje. Řešit by se to dalo tak, ţe oddělíte část cesty před lomítkem a část za ním. U části před lomítkem pak můţete předpokládat, ţe uţ je malými písmeny. Aby se navíc negenerovala hlášení o přesunu souborů na sebe samé, je záhodno oddělit zpracování adresářů a souborů: #adresáře find. -type d grep '[A-Z]' > seznam perl -pe 's/(.*\/)(.*)/mv \L\1\E\2 \L\1\2/' seznam > akce source akce #soubory - adresáře už nezlobí find. grep '[A-Z]' > seznam perl -pe 's/(.*)/mv \1 \L\1/' seznam > akce source akce rm seznam akce Stránka 21
22 6.1. Klasické a rozšířené regulární výrazy Programy grep a egrep rozštěpily regulární svět na dva proudy. Kaţdý z nich pouţíval poněkud jinou variantu regulárních výrazů a také jiný algoritmus pro jejich hledání. Regulární výrazy grepu představují klasickou variantu, zatímco odrůdě reprezentované egrepem se říká rozšířené regulární výrazy. Základní rozdíly rozšířených regulárních výrazů proti klasickým byly následující: zavedly speciální znaky + a? pro alespoň jeden a nanejvýš jeden výskyt, znak pro "nebo" a nepodporovaly mechanismus zapamatování. Postupem času se však původní rozdíly smazávaly a obě odrůdy implementovaly konstrukce, které byly původně k dispozici jen u konkurence. Takţe mezi současným GNU grepem a GNU egrepem je rozdíl pouze v tom, kde se píší zpětná lomítka. V předminulém odstavci jste moţná zastříhali ušima, protoţe jsem se zmínil o dosud utajené konstrukci. Jedná se o "nebo", které se zapisuje v podobě svislé čáry ( ). U klasických regulárních výrazů se před ni zapisuje zpětné lomítko (pokud je vůbec k dispozici). "Nebo" má niţší prioritu neţ zřetězení, takţe například egrep 'raz dva' najde řádky obsahující řetězec "raz" nebo "dva". Pokud potřebujete účinek omezit, pouţijte závorky. Následující příkaz vyhledá řádky, které začínají řetězcem "From:" nebo "Subject:" (můţe se hodit například pro prohledávání vaší poštovní schránky): egrep '^(From Subject):' V podání grepu by příkaz vypadal takto: grep '^\(From\ Subject\):' Stránka 22
23 7.Regulární stroje N astal čas podívat se alespoň orientačně na zoubek algoritmům, které se starají o interpretaci regulárních výrazů. Lze je rozdělit do tří kategorií: Klasický nedeterministický Tento algoritmus jsem popsal ve druhé části seriálu. Je zaloţen na rekurzi a své usilování skončí, jakmile narazí na první řetězec vyhovující srovnávanému vzoru. Pouţívá jej valná většina programů - grep, vi, Perl a další. Nedeterministický podle POSIXu Jedná se o variantu klasického algoritmu, jejíţ chování se liší, pokud regulární výraz obsahuje "nebo". POSIX varianta se nezastaví při prvním nálezu. Místo toho prozkoumá všechny moţné vyhovující řetězce a z těch, které začínají nejdříve, pak vybere ten nejdelší. Důsledkem je, ţe výsledek nezávisí na pořadí alternativ. Vezměme řetězec "12345" a srovnejme jej s regulárními výrazy 1+ [0-9]+ a [0-9]+ 1+. Pokud se pouţívá klasický nedeterministický algoritmus, budou výsledky rozdílné: prvnímu výrazu vyhoví podřetězec "1", zatímco při pouţití druhého vyhoví celý řetězec "12345". Klasický algoritmus začne zkoumat první alternativu a jakmile najde vyhovující řetězec, skončí. Naproti tomu při POSIXovém algoritmu v obou případech vyhoví "12345", protoţe obě alternativy začínají na stejné pozici a tato je delší. Za svou nezávislost na pořadí platí POSIXový algoritmus rychlostí. Jelikoţ musí prozkoumat všechny varianty, je nejpomalejší. Upřímně řečeno představuje spíše teoretickou moţnost, protoţe jsem se dočetl pouze o několika málo programech, které jej implementují (jediné obecněji rozšířené jsou lex a mawk). Deterministický Deterministický algoritmus stojí na zcela odlišném principu. Nepouţívá rekurzi, ale paralelně sleduje všechny moţné způsoby, jak vyhovět danému vzoru. Stejně jako předchozí tedy najde všechny alternativy a vybere nejdelší z nejlevějších, takţe je také nezávislý na pořadí. Jelikoţ celý řetězec zpracuje jedním průchodem bez návratů, je nejrychlejší. Platí za to nemoţností zapamatovat si části vyhovující jednotlivým podvýrazům. Deterministický algoritmus pouţívá egrep a awk. Z hlediska taxonomie regulárních strojů mají velmi zvláštní pozici GNU nástroje. Jsou totiţ dvoumotorové: obsahují implementaci jak deterministického, tak klasického nedeterministického algoritmu. Pokud to jde, pouţívají rychlejší deterministický. Jakmile Stránka 23
24 však přikáţete něco si zapamatovat, sáhnou po nedeterministickém. Díky tomu například GNU egrep na rozdíl od klasického egrepu nabízí mechanismus zapamatování. Stránka 24
25 8.Speciality Perlu Na poslední díl našeho seriálu jsem si pošetřil speciality jazyka Perl. Pokud se vám při zahlédnutí jména Perl pováţlivě zvedá hladina adrenalinu, podívejte se alespoň na konec článku. Najdete tam odkazy na literaturu a srovnávací tabulku speciálních znaků, kteréţto materiály by se vám mohly hodit. Perl je do značné míry srdeční záleţitost. Znám řadu jeho vášnivých zastánců a zrovna tak jeho zuřivé odpůrce. Ten jazyk je pohledem teoretika mimořádně odporný, ale zároveň neuvěřitelně mocný a praktický. Docela výstiţně (a velmi vtipně) to myslím vyjádřil Jeffrey E. F. Friedl ve své knize o regulárních výrazech: Síla Perlu můţe být ničivou zbraní v rukách zkušeného uţivatele, zdá se však, ţe v Perlu sbíráte zkušenosti tak, ţe se opakovaně střílíte do nohy. Dnes se ale nehodlám věnovat jazyku jako takovému. Raději se soustředím na jeho speciality v oboru regulárních výrazů. A v tomto směru je v současnosti jasná jednička, ať se to jeho odpůrcům líbí nebo ne Uvolněná syntax Regulární výrazy jsou velmi kondenzované, coţ je bohuţel činí obtíţně srozumitelnými. Obecně si troufám prohlásit, ţe regulární výraz je často snadnější vytvořit neţ jej sám po sobě pochopit. Do jazyka Perl (přesněji řečeno do verze 5, ale ta uţ je na světě pět let, takţe ji lze povaţovat za standard jazyka) proto přibyla moţnost rozvolnění zápisu regulárních výrazů. Nepřidává ţádné nové konstrukce, jen je umoţňuje srozumitelně zapsat. Uvolněnou syntax zapíná volba x v operátoru pro hledání či nahrazování (operátory m a s). Regulární výraz se pak zapisuje do sloţených závorek podobně jako blok programu, ignorují se v něm mezery a konce řádků (pokud jim nepředchází zpětné lomítko) a komentáře zahájené znakem #. V části o zapamatování jste se mohli setkat s nechutnou substitucí s/([^:]*):([^:]*:){3}([^:]*).*/<a href="/~\1">\3<\/a>/ která z řádků v /etc/passwd vyráběla seznam domácích stránek uţivatelů. S vyuţitím uvolněné syntaxe bychom ji mohli přepsat následovně: s{ ([^:]*): #přihlašovací jméno (1) ([^:]*:){3} #přeskočíme heslo, UID a GID ([^:]*) #vlastní jméno (3) Stránka 25
26 .* #přeskočíme zbytek }{<a href="/~\1">\3</a>}x Nepřipadá vám to o dost srozumitelnější? Upozorňuji, ţe uvolněná syntax se týká pouze regulárního výrazu, nikoli nahrazujícího řetězce. V něm se projeví pouze tím, ţe je uzavřen do sloţených závorek Drobnosti, které potěší Perl nabízí řadu konstrukcí, které sice nepřinášejí nějakou zásadní inovaci stran schopností regulárních výrazů, ale v běţném ţivotě silně potěší. Asi nejčastěji pouţívané jsou kategorie znaků. Z těch nejběţnějších lze jmenovat: Zápis Význam Odpovídá \d číslice [0-9] \D nečíslice [^\d] \w alfanumerický znak [a-za-z_0-9] \W nealfanumerický znak [^\w] \s prázdný znak [\ \t\n\r] \S neprázdný znak [^\s] Tyto speciální znaky celkem výrazně přispívají ke srozumitelnosti regulárních výrazů. Navíc pokud svůj program zahájíte příkazem use locale, budou mezi alfanumerické znaky zařazeny i akcentované znaky národní abecedy. Výměnu prvních dvou slov na řádku pak zajistí celkem mírumilovný příkaz s/(\w+)(\w+)(\w+)/\3\2\1/ Kromě Perlu uţ převzaly podobné znakové kategorie i současné verze dalších nástrojů (konzultujte s dokumentací). Kromě nich je leckde podporován i zápis kategorií podle POSIXu, kde se například číslice zapisuje jako [:digit:], alfanumerický znak jako [:alnum:] a prázdné místo [:space:]. Tyto kategorie se však zapisují mezi [], takţe například řádek začínající číslicí se vyjádří pomocí ^[[:digit:]], coţ uţ má k eleganci poměrně daleko (totéţ v Perlu: ^\d). Perl POSIXové kategorie podporuje aţ od verze 5.6. Syté (téţ líné) opakování pomůţe řešit problémy s nadměrnou ţravostí opakovacích konstrukcí. Zapisuje se jednoduše: za opakovací znak (*, +,? či {min,max}) připojíte otazník. Přípustný počet opakování se tím nijak nezmění, ale na rozdíl od klasické varianty se snaţí, aby opakování bylo co nejméně. Takţe třeba oblíbený řetězec v uvozovkách lze hledat pomocí ".*?". Je to přehlednější, ale pomalejší neţ obvyklé řešení "[^"]*". Třetí uţitečnou drobností jsou závorky bez zapamatování. Slouţí výlučně k vymezení části regulárního výrazu (např. pro opakování nebo omezení působnosti "nebo"). Vyhovující řetězec se neukládá, takţe vám ubyde špetka starostí při počítání indexů těch zapamatovaných. Tyto speciální závorky se zapisují ve tvaru (?:...). Stránka 26
27 Ještě jednou přepracuji příklad pro transformaci řádku z /etc/passwd na poloţku v seznamu domácích stránek. S vyuţitím popsaných konstrukcí by mohl vypadat takto: s{ (.*?): #přihlašovací jméno (1) (?:.*?:){3} #přeskočíme heslo, UID a GID (.*?): #vlastní jméno (2).* #přeskočíme zbytek }{<a href="/~\1">\2</a>}x Tentokrát se v části přeskakující heslo, UID a GID vyhnu zapamatování, takţe pod čísly 1 a 2 mám uloţeny skutečně jen ty informace, které mne zajímají. Dvojtečka z konstrukce (?: se v tomto případě bohuţel nepěkně plete s oddělovačem poloţek, ale s tím se nedá nic dělat. Líné opakování mi umoţnilo poněkud zjednodušit výrazy pro jednotlivé části řádku Vyhlížení Dost silný nástroj pro některé speciální případy nabízí tak zvané vyhlíţení (anglicky lookahead). Existuje ve dvou odrůdách: pozitivní vyhlíţení se zapisuje v podobě (?=výraz) a je splněno, pokud následující část řetězce vyhovuje výrazu. Negativní vyhlíţení (?!výraz) naopak uspěje, pokud výrazu nevyhovuje. Důleţité je, ţe vyhlíţení se jen podívá, zda se vzor dá či nedá najít, ale neposouvá zkoumanou pozici dál (jemu odpovídající řetězec je vţdy prázdný). Vzoru \d+(?= Kč) vyhoví neprázdná posloupnost číslic, ale jen pokud za ní následuje řetězec " Kč". Ten však sám o sobě není zahrnut do vyhovujícího řetězce. Takţe pokud příkaz s/(\d+)(?= Kč)/???/g vypustíte na řetězec Párátka 20 CX Turbo za 25 Kč kus obdrţíte výsledek Párátka 20 CX Turbo za??? Kč kus Za příklad negativního vyhlíţení můţe poslouţit (?!000)\d\d\d, kterému vyhoví libovolná trojice číslic s výjimkou 000. Faktem je, ţe vyhlíţení není principiálně nezbytné. Zpravidla je lze nahradit jinými konstrukcemi jazyka. Například zachování " Kč" za skupinou číslic by se dalo zařídit pomocí zapamatování. Test na trojici číslic, ne však 000 by se dal rozloţit do dvou nezávislých testů a podobně. V některých případech však vyhlíţení dává zajímavé moţnosti. Stránka 27
28 Hezkou vychytávkou vyuţívající vyhlíţení je oddělování řádů ve velkých číslech. Mezi trojice číslic se mají vloţit mezery, takţe z " " vznikne " ". Vtip je v tom, ţe se trojice počítají odzadu, na coţ regulární výrazy nejsou příliš zařízené. Vyhlíţení umoţňuje následující řešení: s{ (\d{1,3}) #za první skupinu patří mezera (?= #ale jen když následuje (?:\d\d\d)+ #alespoň jedna trojice číslic (?!\d) #a tím číslo končí ) }{\1 }gx Díky vyhlíţení se můţete přesvědčit, ţe počet číslic, které následují za aktuální pozicí ve zpracovávaném řetězci, je násobkem tří. Vyhlíţení zároveň zajistí, ţe se tato pozice nezmění a ţe se při příštím opakování (díky volbě g se provádí pro všechny výskyty) se bude pokračovat za naposledy vloţenou mezerou. 9.Literatura Pokud je mi známo, vyšla zatím jediná kniha věnovaná výlučně regulárním výrazům. Napsal ji Jeffrey E. F. Friedl a jmenuje se Mastering Regular Expressions (vydalo nakladatelství O'Reilly & Associates v roce 1997, ISBN ). Není to pochopitelně vyslovená oddechovka, ale v rámci moţností vysvětluje vlastnosti regulárních výrazů, vhodné a nevhodné techniky pro jejich vytváření. Vzhledem k rozsahu přes 300 stran si můţe dovolit jít dost do hloubky. Cenné sluţby odvede kniha Unix Power Tools, jejímiţ autory jsou Jerry Peek, Tim O'Reilly a Mike Loukides. Vyšla také u O'Reilly & Associates v roce 1997 (2. vydání, ISBN ). Obsahuje velmi slušnou kapitolu o regulárních výrazech a kromě ní řadu tipů a triků na vyuţívání programů, které s nimi pracují. Osobně ji povaţuji za jednu z nejpřínosnějších kníţek, které jsem kdy měl v ruce. Stránka 28
29 10. Přehledová tabulka Jako závěrečnou přílohu vám nabízím stručný přehled regulárních výrazů v nejběţnějších nástrojích. Konkrétně se jedná o GNU grep a egrep verze 2.3, GNU awk verze 3.0.4, vim verze 5.5 a Perl verze 5.005_03. Regulární výrazy GNU grep GNU egrep GNU awk vim Perl znaky libovolný znak (kromě \ n)..... jeden ze znaků [ ] [ ] [ ] [ ] [ ] kromě těchto znaků [^ ] [^ ] [^ ] [^ ] [^ ] skupiny \ w \ W \ d \ D \ s \ S o o o o o o o o o o o o POSIXové skupiny o o o o opakování libovolný počet * * * * * *? alespoň jeden \+ + + \+ + +? nanejvýą jeden \??? \???? min aľ max \{min,max\} {min,max} {min,max} \{min,max\} {min,max} {}? pozice začátek řetězce ^ ^ ^ ^ ^ konec řetězce $ $ $ $ $ hranice slova \< \> \< \> \< \> \ y \< \> \ b závorky a pamě» skupina se zapamatováním \( \) ( ) \( \) ( ) skupina bez paměti ( ) (?: ) třetí zapamatovaný \ 3 \ 3 \ 3 \ 3 $3 Legenda: o podporuje nepodporuje Stránka 29
Jak na hromadné nahrazování textu?
Jak na hromadné nahrazování textu? Verze článku pro čtení: http://root.cz/clanek.php4?id=77 11.05.1999 Určitě se vám již stalo, že jste potřebovali v několika souborech změnit text podle vám známého pravidla.
Programování. Bc. Veronika Tomsová
Programování Bc. Veronika Tomsová Regulární výrazy Regulární výrazy slouží k porovnání a zpracovaní textu PHP podporuje syntaxi POSIX-Extended Regulární výrazy jsou velice vhodné například k ověření emailové
Úvod do UNIXu. Okruh č. 4 - vi, regulární výrazy, grep a sed. Jakub Galgonek. verze r2. inspirováno materiály Davida Hokszy
Okruh č.4 Okruh č. 4 - vi, regulární výrazy, grep a sed verze 1.0.0-r2 inspirováno materiály Davida Hokszy Textové editory Okruh č.4 vi(m) prastarý textový editor (1976) dostupný v podstatě na každém UNIXovém
more Program se zastaví vždy po vypsání jedné stránky textu. Ukončení Ctrl+C less Umožňuje pohybovat se v souboru dopředu i dozadu.
GREP, AWK, SED a jiné filtry v LINUXu Vybrané filtry more Program se zastaví vždy po vypsání jedné stránky textu. Ukončení Ctrl+C less Umožňuje pohybovat se v souboru dopředu i dozadu. head [-n] tail [-n]
Regulární výrazy. jemný úvod. Miloslav Brada
Regulární výrazy jemný úvod Miloslav Brada Regulární výrazy - RegExy K čemu vůbec jsou? Nástin možností Jednoduché vzory, pravidla regexpů Metaznaky Opakování Skupiny Jednoduchý příklad na závěr 2 Co RegExy
PHP tutoriál (základy PHP snadno a rychle)
PHP tutoriál (základy PHP snadno a rychle) Druhá, vylepšená offline verze. Připravil Štěpán Mátl, http://khamos.wz.cz Chceš se naučit základy PHP? V tom případě si prostuduj tento rychlý průvodce. Nejdříve
Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.
Přednáška 7 Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu. 1 Příkaz expr výraz Celočíselná aritmetika I Zašle na standardní výstup vyhodnocení výrazu
grep a regulární výrazy
grep a regulární výrazy Josef Hajas hajasj1@fel.cvut.cz http://cs.felk.cvut.cz/~hajasj1/unix/ Vysázeno v LAT E Xu p.1/1 Co nás čeká grep: K čemu slouží? Jak používat? nejpoužívanější přepínače grepu regulární
Přednáška 4. Regulární výrazy. Filtry grep, sed a awk. Úvod do Operačních Systémů Přednáška 4
1 Přednáška 4 Regulární výrazy. Filtry grep, sed a awk. 2 grep grep [přepínače] vzor [soubory] Implicitně vypíše na standardní výstup řádky, které obsahují zadaný vzor. Vzor může být definován základním
Regulární výrazy. Filtry grep, sed a awk.
Přednáška 5 Regulární výrazy. Filtry grep, sed a awk. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2011 Příprava studijního programu Informatika je podporována projektem
Regulární výrazy. Vzory
Regulární výrazy Regulární výrazy jsou určeny pro práci s textovými řetězci, jsou součástí J2SDK až od verze 1.4, v předchozích verzích je potřeba použít některou z externích knihoven, např. knihovnu ORO
PROGRAMOVÁNÍ V SHELLU
PROGRAMOVÁNÍ V SHELLU Prostředí, jazyk, zdrojový kód chceme-li posloupnost jistých příkazů používat opakovaně, případně z různých míst adresářové struktury, můžeme tuto posloupnost uložit souboru, který
Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:
Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury
HROMADNÉ ÚPRAVY NAJÍT A NAHRADIT
HROMADNÉ ÚPRAVY NAJÍT A NAHRADIT Funkce Najít a nahradit slouží k rychlému vyhledávání určitých slov a jejich nahrazování jinými slovy. Lze hledat i určité varianty slov a nahrazovat je buď hromadně (všechny
PSK3-9. Základy skriptování. Hlavička
PSK3-9 Název školy: Autor: Anotace: Vyšší odborná škola a Střední průmyslová škola, Božetěchova 3 Ing. Marek Nožka Základy skriptování v unixovém shellu Vzdělávací oblast: Informační a komunikační technologie
Regulární výrazy a grep
A7B38UOS Úvod do operačních systémů 5. Cvičení Regulární výrazy a grep Grep grep [přepínače] vzor [soubory] Implicitně vypíše na standardní výstup řádky, které vyhoví zadanému vzoru. -i nerozlišuje malá
Pokročilé uţivatelské školení
Pokročilé uţivatelské školení Cíl a obsah kurzu Cílem kurzu je seznámit se s pokročilými funkcemi aplikace Word Členění kurzu, obsah jednotlivých lekcí Kurz je členěn do pěti samostatných lekcí. Kaţdá
Základy HTML. Autor: Palito
Základy HTML Autor: Palito Zobrazení zdrojového kódu Zobrazení zdrojového kódu Každá stránka je na disku nebo na serveru uložena ve formě zdrojového kódu. Ten kód je psaný v jazyce HTML. Když si chcete
Programovací jazyk Pascal
Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce
MANUÁL PRO STUDENTY ŠKOLNÍ INFORMAČNÍ SYSTÉM
MANUÁL PRO STUDENTY ŠKOLNÍ INFORMAČNÍ SYSTÉM Obsah 1. SLOVO NA ÚVOD... 2 2. MANUÁL K JEDNOTLIVÝM ÚKONŮM... 2 A. PRVNÍ PŘIHLÁŠENÍ DO ŠISU... 2 B. UŢIVATELSKÉ JMÉNO A HESLO... 3 C. ÚVODNÍ STRÁNKA (HOME)
Konečný automat. Jan Kybic.
Konečný automat Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 2017 1 / 33 Konečný automat finite state machine Konečný automat = výpočetní model, primitivní počítač Řídící jednotka s
Jednoduché cykly 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
Jednoduché cykly Tento oddíl obsahuje úlohy na první procvičení práce s cykly. Při řešení každé ze zde uvedených úloh stačí použít vedle podmíněných příkazů jen jediný cyklus. Nepotřebujeme používat ani
FUNKCE 3. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen 2013. Ročník: sedmý. Vzdělávací oblast: Informatika a výpočetní technika
FUNKCE 3 Autor: Mgr. Dana Kaprálová Datum (období) tvorby: září, říjen 2013 Ročník: sedmý Vzdělávací oblast: Informatika a výpočetní technika 1 Anotace: Žáci se seznámí se základní obsluhou tabulkového
Základní příkazy UNIXu (Linuxu)
Základní příkazy UNIXu (Linuxu) Ostatní clear smazání obrazovky man nápověda k příkazům (zkus man man) Ovládání příkazu man PgUp, b stránka vzhůru PgDn, mezerník stránka dolů šipky nahoru a dolů pohyb
DUM č. 5 v sadě. 34. Inf-10 Praktická typografie s LO Writer/MS Word
projekt GML Brno Docens DUM č. 5 v sadě 34. Inf-10 Praktická typografie s LO Writer/MS Word Autor: Lukáš Rýdlo Datum: 30.01.2014 Ročník: 4AV, 4AF Anotace DUMu: Nahrazování textu a opravy pomocí regulárních
DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v
DSL manuál Ing. Jan Hranáč 27. října 2010 V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v současné době krátký) seznam vestavěných funkcí systému. 1 Vytvoření nového dobrodružství Nejprve
PHP PHP je skriptovací programovací jazyk dynamických internetových stránek PHP je nezávislý na platformě
PHP PHP původně znamenalo Personal Home Page a vzniklo v roce 1996, od té doby prošlo velkými změnami a nyní tato zkratka znamená Hypertext Preprocessor. PHP je skriptovací programovací jazyk, určený především
A7B38UOS Úvod do operačních systémů. 6. Cvičení. Příkazy sed a awk
A7B38UOS Úvod do operačních systémů 6. Cvičení Příkazy sed a awk sed sed [přepínače] 'příkaz' [soubory] sed [přepínače] -f skript [soubory] Stream editor - edituje neinteraktivně jeden nebo více souborů.
Lokální definice (1) plocha-kruhu
Lokální definice (1) syntaxe: (local (seznam definic) výraz) definice jsou dostupné pouze uvnitř příkazu local příklad: (local ( (define Pi 3.1415926) (define (plocha-kruhu r) (* Pi r r)) ) (plocha-kruhu
- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku
Znaky - standardní typ char var Z, W: char; - znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku - v TP (často i jinde) se používá kódová
Co jsou to regulární výrazy? Regulárními výrazy se používají ke zpracovávání textových řetězců. Vytvoříme si tzv. masku a zjišťujeme, zda jí textový řetězec vyhovuje (např. zda se skládá ze samých čísel
1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:
1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.
Algoritmizace a programování
Algoritmizace a programování Typy Základní (primitivní) datové typy Deklarace Verze pro akademický rok 2012/2013 1 Typy v jazyce Java Základní datové typy (primitivní datové typy) Celočíselné byte, short,
PŘÍKAZOVÝ ŘÁDEK ZÍSKÁVÁNÍ NÁPOVĚDY
PŘÍKAZOVÝ ŘÁDEK ZÍSKÁVÁNÍ NÁPOVĚDY Název školy Obchodní akademie, Vyšší odborná škola a Jazyková škola s právem státní jazykové zkoušky Uherské Hradiště Název DUMu Příkazový řádek získávání nápovědy Autor
Regulární výrazy. Honza Vrbata
Regulární výrazy Honza Vrbata honza@vrbata.cz CO TO JE? Regulární výraz (regular expression) je speciálně zkonstruovaný řetězec popisující celou množinu řetězců, konkrétně regulární jazyk. Prakticky se
Tabulkový procesor. Základní rysy
Tabulkový procesor Tabulkový procesor je počítačový program zpracovávající data uložená v buňkách tabulky. Program umožňuje použití vzorců pro práci s daty a zobrazuje výsledné hodnoty podle vstupních
Celostátní kolo soutěže Baltík 2008, kategorie C
Pokyny: 1. Pracujte pouze v ikonkových reţimech! 2. Řešení úloh ukládejte do sloţky, která se nachází na pracovní ploše počítače. Její název je stejný, jako je kód, který dostal váš tým přidělený (např.
1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:
1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.
1.5.1 Číselné soustavy
.. Číselné soustavy Předpoklady: základní početní operace Pedagogická poznámka: Tato hodina není součástí klasické gymnaziální sady. Upřímně řečeno nevím proč. Jednak se všichni studenti určitě setkávají
Cvičení 2. Přesměrování vstupu a výstupu. Posloupnost příkazů. Příkazy pro informaci o uživatelích
Cvičení 2 Přesměrování vstupu a výstupu Příkaz > abc výstup příkazu jde do souboru abc. Pokud soubor neexistuje je vytvořen. Pokud existuje je přepsán. Příkaz >> abc výstup příkazu jde do souboru abc.
Úvod do Unixu. man: příkaz pro zobrazení nápovědy k danému příkazu, programu (pokud je k dispozici), např. man cp. pwd: vypíše cestu k aktuální pozici
Základní příkazy Úvod do Unixu man: příkaz pro zobrazení nápovědy k danému příkazu, programu (pokud je k dispozici), např. man cp vypíše nápovědu o příkazu cp, manuálová stránka se ukončí stisknutím klávesy
Manuál k ovládání aplikace INFOwin.
Manuál k ovládání aplikace INFOwin. Základní práce s formuláři je ve všech modulech totožná. Vybereme tedy například formulář Pokladní kniha korunová na kterém si funkce ukážeme. Po zápisech se lze pohybovat
Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010
Dynamické programování Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Rozděl a panuj (divide-and-conquer) Rozděl (Divide): Rozděl problém na několik podproblémů tak, aby tyto podproblémy odpovídaly původnímu
Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání
Čtvrtek 3. listopadu Makra v Excelu Obecná definice makra: Podle definice je makro strukturovanou definicí jedné nebo několika akcí, které chceme, aby MS Excel vykonal jako odezvu na nějakou námi definovanou
2.4.4 Kreslení grafů funkcí metodou dělení definičního oboru I
.. Kreslení grafů funkcí metodou dělení definičního oboru I Předpoklady: 01, 08 Opakování: Pokud jsme při řešení nerovnic potřebovali vynásobit nerovnici výrazem, nemohli jsme postupovat pro všechna čísla
Úvod do programování 6. hodina
Úvod do programování 6. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015 Umíme z minulé hodiny Algoritmy Třídění pole: Selection
Úloha 3 editor a skripty. připojte se vzdáleně na dray6.feld.cvut.cz heslo získáte na adrese https://service.felk.cvut.cz/heslo
Domácí příprava k předmětu YD38UOS Úloha 1 vzdálené připojení připojte se vzdáleně na dray6.feld.cvut.cz heslo získáte na adrese https://service.felk.cvut.cz/heslo pro připojení použijte protokol ssh (pokud
Systém souborů (file system, FS)
UNIX systém souborů (file system) 1 Systém souborů (file system, FS)! slouží k uchování dat na vnějším paměťovém médiu a zajišťuje přístup ke struktuře dat! pro uživatele možnost ukládat data a opět je
Backspace maže znaky před kurzorem (tedy zprava)
7. Textové editory úvod Textový editor aplikace, program pro psaní textů Obr. 1 Escape (Esc) vyskakovací klávesa, funguje jako storno Backspace maže znaky před kurzorem (tedy zprava) Delete maže znaky
MODUL MUNI ASPI, a. s muni_manual.indd :57:23
MODUL MUNI ASPI, a. s. 2006 OBSAH OBSAH 1. ÚVOD.......................................................................... 4 2. ZADÁNÍ DOTAZU................................................................
UŢIVATELSKÁ PŘÍRUČKA MODUL MECHANIZAČNÍ PROSTŘEDKY APLIKACE - HLÁŠENÍ O PROVEDENÝCH TECHNICKÝCH KONTROLÁCH ZÁKLADNÍ POPIS
UŢIVATELSKÁ PŘÍRUČKA MODUL MECHANIZAČNÍ PROSTŘEDKY APLIKACE - HLÁŠENÍ O PROVEDENÝCH TECHNICKÝCH KONTROLÁCH ZÁKLADNÍ POPIS 25.02.2011 Brno Variex Uţivatelská příručka pro provoz aplikace Hlášení o provedených
EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI
EVROPSKÝ SOCIÁLNÍ FOND Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI Úvod do PHP PHP Personal Home Page Hypertext Preprocessor jazyk na tvorbu dokumentů přípona: *.php skript je součást HTML stránky!
Informatika 8. třída/6
Rekurze Jedním z důležitých principů pro návrh procedur je tzv. rekurze. Nejlépe uvidíme tento princip na příkladech dvou velmi jednoduchých procedur (hvězdička označuje násobení). Rekurze vlastně označuje
Algoritmizace prostorových úloh
INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Algoritmus Daniela Szturcová Tento
Odstranění řádků (na základě hodnoty)
Odstranění řádků (na základě hodnoty) patří k častým dotazům v diskusích. Úlohu je třeba rozdělit na dvě části nalezení požadovaných buněk a následné odmazání řádků, na kterých leží. Výběr buněk lze provádět
Funkce. Definiční obor a obor hodnot
Funkce Definiční obor a obor hodnot Opakování definice funkce Funkce je předpis, který každému číslu z definičního oboru, který je podmnožinou množiny všech reálných čísel R, přiřazuje právě jedno reálné
( ) Jako základ mocnin nemusíme používat jen 10. Pokud není jasné, že číslo je uvedeno v desítkové soustavě, píšeme jej takto: ( 12054 ) 10
.. Číselné soustavy I Předpoklady: základní početní operace Pedagogická poznámka: Tato a následující hodina není součástí klasické gymnaziální sady. Upřímně řečeno nevím proč. Jednak se všichni studenti
NP-úplnost problému SAT
Problém SAT je definován následovně: SAT(splnitelnost booleovských formulí) Vstup: Booleovská formule ϕ. Otázka: Je ϕ splnitelná? Příklad: Formule ϕ 1 =x 1 ( x 2 x 3 )jesplnitelná: např.přiohodnocení ν,kde[x
12 Metody snižování barevného prostoru
12 Metody snižování barevného prostoru Studijní cíl Tento blok je věnován základním metodám pro snižování barevného rozsahu pro rastrové obrázky. Postupně zde jsou vysvětleny důvody k použití těchto algoritmů
1.5.2 Číselné soustavy II
.. Číselné soustavy II Předpoklady: Př. : Převeď do desítkové soustavy čísla. a) ( ) b) ( ) 4 c) ( ) 6 = + + + = 7 + 9 + = a) = 4 + 4 + 4 = 6 + 4 + = 9 b) 4 = 6 + 6 + 6 = 6 + 6 + = 6 + + = 69. c) 6 Pedagogická
THEOPHILOS. (návod k použití)
THEOPHILOS (návod k použití) Nejprve si z internetových stránek www.theophilos.com (nebo www.theophilos.sk) stáhněte všechny soubory, které Vás zajímají a nainstalujte je (podrobný návod na instalaci programu
PRACUJEME S SHELLEM Ať žije BASH.
PRACUJEME S SHELLEM Ať žije BASH. V této lekci nakoukneme do základů shellu Bash. Trocha nudné teorie. Název je akronym pro Bourne again shell, což poukazuje na jeho základ v dříve nejpoužívanějším unixovém
Přednáška 8. Proměnné. Psaní a ladění skriptů. Parametry skriptu. Vstup a výstup. Konfigurační soubory shellu. Úvod do Operačních Systémů Přednáška 8
Přednáška 8 Proměnné. Psaní a ladění skriptů. Parametry skriptu. Vstup a výstup. Konfigurační soubory shellu. 1 Proměnné Jména nových proměnných by neměly kolidovat se jmény předdefinovaných proměnných.
Regulární výrazy. Definice Množina regulárních výrazů nad abecedou Σ, označovaná RE(Σ), je definována induktivně takto:
IB102 Automaty, gramatiky a složitost, 6. 10. 2014 1/29 Regulární výrazy Definice 2.58. Množina regulárních výrazů nad abecedou Σ, označovaná RE(Σ), je definována induktivně takto: 1 ε, a a pro každé a
C2110 Operační systém UNIX a základy programování
C2110 Operační systém UNIX a základy programování 5. lekce Petr Kulhánek kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Masarykova univerzita, Kotlářská 2, CZ-61137 Brno C2110 Operační systém
Kódový zámek k rodinnému domu
Středoškolská technika 2012 Setkání a prezentace prací středoškolských studentů na ČVUT Kódový zámek k rodinnému domu Zdeněk Kolář SPŠST Panská Panská 3, Praha1 Cílem tohoto projektu je moţnost otevírání
Skripty - úvod. Linux - skripty 2
Linux - skripty Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Ing. Libor Otáhalík. Dostupné z Metodického portálu www.rvp.cz, ISSN: 1802-4785. Provozuje Národní ústav pro vzdělávání,
Operační systém UNIX
UNIX z pohledu uživatele 1 Operační systém UNIX Nejzákladnější komponenty:! jádro (kernel)! shell! utility Jádro operačního systému! v podstatě představuje vlastní operační systém! fyzicky je to jediný
Manuál k internetovému obchodu IQIS. Manuál k internetovému obchodu IQIS
Manuál k internetovému obchodu IQIS 1 Obsah 1.... 2 3. Uživatelé... 3 Úrovně oprávnění... 3 Vytvoření nového uživatele... 3 Editace existujícího uživatele... 3 Povolení uživatele... 3 Zakázání uživatele...
Základy algoritmizace. Pattern matching
Základy algoritmizace Pattern matching 1 Pattern matching Úloha nalézt v nějakém textu výskyty zadaných textových vzorků patří v počítačové praxi k nejfrekventovanějším. Algoritmy, které ji řeší se používají
LINUX SOUBORY. Zadejme příkaz ls l! V této lekci se odrazíme od dlouhého výpisu příkazu ls a uvidíme, kam nás to zanese. SPŠ Teplice - 3.
LINUX SOUBORY Zadejme příkaz ls l! V této lekci se odrazíme od dlouhého výpisu příkazu ls a uvidíme, kam nás to zanese. Dlouhý výpis příkazu ls Zadejte příkaz ls s parametrem l. Před každou položkou (souborem
Střední odborná škola a Střední odborné učiliště, Hořovice
Kód DUM : VY_32_INOVACE_LIN.1.03 Název materiálu: Anotace Autor Jazyk Očekávaný výstup 03 BASH rozbory a psaní skriptů DUM naučí psát elementární BASH skripty, ukáže zásady psaní cyklů a přepínačů Ing.
Algoritmizace a programování
Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu
Jak vyhledávat. Vyhledávače KAPITOLA 3
KAPITOLA 3 Jak vyhledávat Už víme, jak zacházet s programem Microsoft Internet Explorer, a můžeme se pustit do surfování. Ostatně, stejně jsme to při seznamování s funkcemi programu chtíce nechtíce dělali.
Regulární výrazy. M. Kot, Z. Sawa (VŠB-TU Ostrava) Úvod do teoretické informatiky 14. března / 20
Regulární výrazy M. Kot, Z. Sawa (VŠB-TU Ostrava) Úvod do teoretické informatiky 14. března 2007 1/ 20 Regulární výrazy Jako například v aritmetice můžeme pomocí operátorů + a vytvářet výrazy jako (5+3)
24. XML. Aby se dokument XML vůbec zobrazil musí být well-formed (správně strukturovaný). To znamená, že splňuje formální požadavky specifikace XML.
24. XML Úvod Značkovací jazyk XML (extensible Markup Language) vznikl ze staršího a obecnějšího jazyku SGML (Standard Generalized Markup Language). XML byl vyvinut konsorciem W3C, aby poskytl standardní
Příručka progecad Professional 2013
6.2 Upravit Obrázek 58: Nabídka Upravit 27. Zpět Upravit Zpět _u z vrátí zpět poslední operaci Tato funkce je jistě známá z mnoha počítačových aplikací, která vrací zpět poslední operaci. Někde je však
Řešení úloh z TSP MU SADY S 1
Řešení úloh z TSP MU SADY S 1 projekt RESENI-TSP.CZ úlohy jsou vybírány z dříve použitých TSP MU autoři řešení jsou zkušení lektoři vzdělávací agentury Kurzy-Fido.cz Masarykova univerzita nabízí uchazečům
Abclinuxu.cz ITBiz AbcHost 64bit AbcPrace UnixShop Stickfish
Hlasuj Celkem 1236 hlasů AbcLinuxu:/ Administrace / Reklamy Správa reklam Na této stránce je moţné spravovat reklamní pozice. Kaţdá pozice má svůj název, popisek a jednu či více reklamních pozic, které
Střední odborná škola a Střední odborné učiliště, Hořovice
Kód DUM : VY_32_INOVACE_LIN.1.02 Název materiálu: Anotace Autor Jazyk Očekávaný výstup 02- Zásady psaní a řetězení příkazů, jednoduchý skript DUM naučí žáky zásady práce s příkazy shellu BASH, zásady psaní
Základy XML struktura dokumentu (včetně testových otázek)
Základy XML struktura dokumentu (včetně testových otázek) Otakar Čerba Oddělení geomatiky Katedra matematiky Fakulta aplikovaných věd Západočeská univerzita v Plzni Přednáška z předmětu Počítačová kartografie
Tato podagenda obsahuje hlavní pracovní prostředí pro editaci artiklů, sledování vývoje cen nebo pohybu artiklů.
3.1.1 SPRÁVA ZBOŢÍ Tato podagenda obsahuje hlavní pracovní prostředí pro editaci artiklů, sledování vývoje cen nebo pohybu artiklů. Zobrazení Správy zboţí bez výběru artiklu Tato ikona odkazuje na agendu
Metodický koncept k efektivní podpoře klíčových odborných kompetencí s využitím cizího jazyka ATCZ62 - CLIL jako výuková strategie na vysoké škole
Pattern matching Metodický koncept k efektivní podpoře klíčových odborných kompetencí s využitím cizího jazyka ATCZ62 - CI jako výuková strategie na vysoké škole Pattern matching porovnávání vzorů Hledání
Tento příklad popíše asi nejzákladnější promoci. Kdyţ si zákazník koupí 3 kusy, dva kusy zaplatí a jeden dostane zdarma.
3.5.11 PŘÍKLADY PROMOCÍ Tato kapitola neslouţí k popisu nějaké zvláštní agendy nebo funkce, ale měla by slouţit k objasnění a ukázaní práce s promocemi. Promoce jsou poměrně logicky sloţitá záleţitost,
Informatika / file system KIT.PEF.CZU
Informatika / file system KIT.PEF.CZU kódování znaků Vlastní návrh kódování Chci psát text a napsané chci uložit pro další použití. Co udělám? Odhadnu počet symbolů, které budu chtít kódovat (nezbytný
1. Umístěte kurzor do sloupce Datový typ na řádek s polem, ve kterém vytvořit chcete seznam.
10.6.7 POSTUP TVORBY KOMBINOVANÉHO SEZNAMU 1. Umístěte kurzor do sloupce Datový typ na řádek s polem, ve kterém vytvořit chcete seznam. 2. V rozbalovací nabídce se seznamem datových typů vyberte volbu
Tvorba počítačové hry. GameJN
Závěrečná práce studentského projektu Tvorba počítačové hry GameJN Evropský sociální fond Praha a EU Investujeme do vaší budoucnosti 2014 1 1. Obsah 1. Obsah... 2 2. Úvod..... 3 3. Jednotlivé programy..
Algoritmizace a programování
Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech
Elegantní algoritmus pro konstrukci sufixových polí
Elegantní algoritmus pro konstrukci sufixových polí 22.10.2014 Zadání Obsah Zadání... 3 Definice... 3 Analýza problému... 4 Jednotlivé algoritmy... 4 Algoritmus SA1... 4 Algoritmus SA2... 5 Algoritmus
Proměnné a parametry. predn_08.odt :00:38 1
Proměnné a parametry predn_08.odt 16.04.2007 14:00:38 1 Proměnné a parametry Jméno proměnné - identifikátor [a-za-z_][a-za-z_0-9]* Hodnota proměnné textový řetězec celočíselná hodnota - ne v sh Přesun
Společnost pro elektronické aplikace. SEA s.r.o. Dolnoměcholupská 21 CZ-10200 Praha 10
Společnost pro elektronické aplikace SEA s.r.o. Dolnoměcholupská 21 CZ-10200 Praha 10 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. Výstup 1. Výstup
Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.
Algoritmus Algoritmus je schematický postup pro řešení určitého druhu problémů, který je prováděn pomocí konečného množství přesně definovaných kroků. nebo Algoritmus lze definovat jako jednoznačně určenou
Základní příkazy OS UNIX
1 Základní příkazy OS UNIX Výpis obsahu adresáře ls [přepínače] [soubor]! výpis informací o zadaných souborech! pokud zadáme jméno adresáře, je vypsán obsah adresáře (seznam souborů, které jsou v adresáři
MAXScript výukový kurz
MAXScript výukový kurz Díl čtvrtý jazyk MAXScript, část I. Jan Melichar, březen 2008 Jan Melichar (aka JME) strana 1 OBSAH ÚVOD... 4 ZÁKLADNÍ PŘÍKAZY... 5 OPERÁTORY... 6 PROMĚNNÉ... 6 POLE... 7 ZÁVĚREM...
Standardní algoritmy vyhledávací.
Standardní algoritmy vyhledávací. Vyhledávací algoritmy v C++ nám umožňují vyhledávat prvky v datových kontejnerech podle různých kritérií. Také se podíváme na vyhledávání metodou půlením intervalu (binární
Příručka uživatele systému Museion. Quick filtr
Příručka uživatele systému Museion Quick filtr Autorská práva Copyright 2015 MUSOFT.CZ, s.r.o.. Všechna práva vyhrazena. Tato příručka je chráněna autorskými právy a distribuována na základě licencí, které
Algoritmizace. 1. Úvod. Algoritmus
1. Úvod Algoritmizace V dnešní době již počítače pronikly snad do všech oblastí lidské činnosti, využívají se k řešení nejrůznějších úkolů. Postup, který je v počítači prováděn nějakým programem se nazývá
Da D to t v o é v ty t py IB111: Datové typy
Datové typy IB111: Datové typy Data a algoritmizace jaká data potřebuji pro vyřešení problému? jak budu data reprezentovat? jaké operaci s nimi potřebuji provádět? Navržení práce s daty je velice důležité
Funkce, podmíněný příkaz if-else, příkaz cyklu for
Funkce, podmíněný příkaz if-else, příkaz cyklu for Definice funkce Funkce je pojmenovaná část programu, kterou lze dále zavolat v jiné části programu. V Pythonu je definována klíčovým slovem def. Za tímto
EBSCO. http://search.ebscohost.com. Poklikneme na možnost EBSCOhost Web. Vybereme (poklepeme, zaškrtneme) databázi, s kterou chceme pracovat.
EBSCO http://search.ebscohost.com Poklikneme na možnost EBSCOhost Web Vybereme (poklepeme, zaškrtneme) databázi, s kterou chceme pracovat. Vyhledávací techniky Rejstříky Pomůckou pro vyhledávání jsou rejstříky,