Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Software
Obcování s ďáblem 18: Speciální regulární výrazy
22. listopadu 2001, 00.00 | Minule jsme se seznámili se základními regulárními výrazy, dnes si ukážeme několik speciálních regulárních výrazů:
Minule jsme se seznámili se základními regulárními výrazy, jež umožňují specifikovat požadovaný znak: vlastně šlo jen o tři možnosti:
- obyčejný znak, který representuje sám sebe;
- seznam přípustných znaků v hranatých závorkách;
- tečka, která representuje jakýkoli znak.
Dnes si ukážeme několik speciálních regulárních výrazů:
Začátek a konec řádku
Vzhledem k tomu, že je často důležité rozlišit, zda je hledaný textový řetězec na okraji řádku nebo uvnitř, nabízejí regulární výrazy dva speciální znaky:
- regulární výraz "^" odpovídá začátku řádku;
- regulární výraz "$" odpovídá konci řádku.
Samy o sobě samozřejmě tyto výrazy nemají žádný smysl; skvěle však slouží ve spojení s ostatními: zatímco regulární výraz "ahoj" odpovídá textovému řetězci "ahoj" kdekoli na řádku, výraz "^ahoj" odpovídá témuž řetězci jen pokud je na začátku řádku, a regulární výraz "^ahoj$" požaduje řádek, na kterém není nic jiného, než slovo "ahoj".
Není řádek jako řádek!
Vzhledem k tomu, že jsme zde vlastně na práci s řádky narazili prvně, stojí za to upozornit na jeden potenciální podraz: pozor na aplikace z prostředí Classic, a pozor na soubory z prostředí DOSu nebo windoze! Oddělovač řádků totiž (ve znakové sadě ASCII, kterou dnes používají všechny běžné mikropočítače) je znak LF ("Line Feed", tj. "přechod na další řádek"), který má kód 10 (0Ah). Ten také všechny standardní příkazy očekávají a korektně interpretují.
Bohužel, jinde je tomu jinak. MS DOS a Windows se dodnes chovají tak, jako by jejich uživatelé namísto klávesnice a obrazovky používali elektrické psací stroje (jejichž prostřednictvím se skutečně před několika desítkami let s počítači komunikovalo): ke znaku LF přidávají ještě naprosto zbytečný znak CR ("carriage return") s kódem 13 (0Dh), který na elektrickém psacím stroji zajistil, aby se tisková hlava před přechodem na další řádek posunula doleva, zpět na začátek řádku. V unixových systémech (mezi které patří i OS X) nám pak CR zůstane na konci každého řádku jako jeden neviditelný znak navíc, se kterým musíme počítat.
V Classicu je to ještě horší: jeho tvůrci si sice správně uvědomili, že dvojice znaků CR,LF ztratila s odchodem elektrických psacích strojů jakýkoli smysl; z nějakého záhadného důvodu si však pro oddělování řádků z nich vybrali ten, který ve skutečnosti nic neodděluje — CR! Celý textový soubor z "classické" aplikace (třeba ze Zápisníku) je proto pro jakýkoli standardní příkaz prostě jedním jediným dlouhatánským řádkem.
Jak tento problém korektně vyřešit si ukážeme později, až se budeme bavit o příkazech tr a sed; prozatím se spokojíme s tím, že se při práci s texty dělenými do řádků budeme nekorektním souborům z Classica nebo windoze vyhýbat.
Výrazy související se slovy
Snad ještě častější než práce s řádky je při zpracování textů práce se slovy. Ačkoli bychom si mohli do značné míry práci se slovy "sestavit" sami s využítím regulárních výrazů typu "[[:alnum:]]", dalo by to spoustu práce, a výsledné regulární výrazy by byly špatně čitelné. Máme proto k dispozici několik speciálních služeb a zkratek:
- regulární výraz "\w" je zkratka, ekvivalentní výrazu "[[:alnum:]]"; podobně "\W" je zkratka, ekvivalentní regulárnímu výrazu "[^[:alnum:]]";
- regulární výraz "\b" odpovídá prázdnému řetězci na okraji slova;
- regulární výraz "\B" odpovídá prázdnému řetězci, který není na okraji slova;
- regulární výrazy "\<" a ">" odpovídají prázdnému řetězci na začátku a na konci slova.
Možná stojí za zmínku si ujasnit, co to znamená, že "regulární výraz odpovídá prázdnému řetězci": jde o to, že použití takového výrazu může omezit textové řetězce, které výrazu odpovídají. Mezi každými dvěma znaky (a před prvním a za posledním) si samozřejmě vždy můžeme představit prázdný řetězec; podle konkrétního umístění a obsahu daných dvou znaků však tento prázdný řetězec bude nebo nebude stát mezi slovy a podobně.
Například regulární výraz ".." odpovídá naprosto libovolné dvojici znaků. Regulární výraz ".\<." však odpovídá jen a jenom takové dvojici znaků, z nichž první je poslední oddělovač před začátkem slova, a druhý je prvním znakem slova. Regulární výraz ".>." už jistě nemusíme vysvětlovat... a pokud bychom chtěli najít jak řetězce, jež odpovídají výrazu ".\<.", tak i řetězce, jež odpovídají výrazu ".>.", můžeme použít výraz ".\b.": tomu odpovídá libovolná dvojice znaků, z nichž jeden (kterýkoli) je oddělovačem, a druhý součástí některého slova. Konečně, co výraz ".\B."? Je vám jasné, čemu bude odpovídat?
Příště...
...si zopakujeme čemu (a proč) odpovídá regulární výraz ".\B.". Kromě toho a především se naučíme regulární výrazy skládat dohromady a kombinovat jejich služby.
Obsah seriálu (více o seriálu):
- Obcování s ďáblem
- Obcování s ďáblem 2 - základy
- Obcování s ďáblem 3 - Práce se soubory
- Obcování s ďáblem 4 - Další práce se soubory
- Obcování s ďáblem 5 - Stále soubory, hlavně linky
- Obcování s ďáblem 6: Pár zbývajících drobností
- Obcování s ďáblem 7: Samá voda, přihořívá, hoří!
- Obcování s ďáblem 8: Jak se do shellu volá, tak se program ozývá
- Obcování s ďáblem 9: Nové finty na programy
- Obcování s ďáblem 10: Do fronty, pánové, do fronty!
- Obcování s ďáblem 11: Standardní vstup a výstup
- Obcování s ďáblem 13: Další triky
- Obcování s ďáblem 14: Vyšší škola hledání souborů
- Obcování s ďáblem 15: Příkaz find stokrát jinak
- Obcování s ďáblem 16: Co se ještě dá uvařit z příkazu find
- Obcování s ďáblem 17: Regulární výrazy
- Obcování s ďáblem 18: Speciální regulární výrazy
- Obcování s ďáblem 19: Skládání regulárních výrazů
- Obcování s ďáblem 20: Regulární výrazy se zpětnými odkazy
- Obcování s ďáblem 21:K čemu je dobrý grep...
- Zázraky ihned, nemožné na počkání: sed
- Obcování s ďáblem - další finty s příkazem sed
- Rozsáhlejší příklad se sedem
- Obcování s ďáblem: Další kouzla, aneb awk
- Awk a proměnné
- Obcování s ďáblem 27: Awk a výrazy
- Obcování s ďáblem: Awk a funkce
- Awk a příkazy
- Co je to vlastně "uživatel"?
- Vlastnictví objektů
- Přístupová práva
- Vlastník, skupina, ostatní...
- Jak je to se skupinami?
- Skupiny a uživatelé
- Scripty
- Komentáře, a volba shellu
- Pro skript může být shell cokoli!
- Shellové skripty a argumenty
- Skripty a proměnné: aritmetika
- Proměnné shellu, "dědění" hodnot
- Práce s proměnnými
- Práce se jmény souborů
- Pole hodnot
- Další triky kolem polí...
- Standardní proměnné shellu
- Základní příkazy pro skripty
- Příkaz if
- Speciální podmínkové příkazy
- Podmínky pro práci se soubory
- Jednoduchý cyklus
- Příkaz for a pomocné příkazy break a continue
- Příkaz case
- Příkazy exit a select
- Rejstřík a přehled
- Procesy
- Informace o procesech
- Další klíčová slova pro příkaz ps
- Příkaz ps: několik praktických přepínačů
- A k čemu že je "ps" dobré?
- Copak procesor, s pamětí je to horší
- Virtuální paměť
- A ještě jednou virtuální paměť
- Zpět k příkazu ps
- Skutečný žrout paměti
- Ještě jednou top
- Doplněk k topu: vm_stat
- Co to tedy všechno znamená?
- Nevychází nám dal a má dáti?
- Kam se stránky ukládají?
- Změna odkládacího disku
- Změna odkládacího disku / fstab
- Poslední poznámka k fstab
- A jak to je se soubory?
- Co vlastně příkaz lsof vypisuje?
- Příkaz lsof a obsah sloupce NAME
- SIPS - Terminál není jen pro nadšence UNIXu
- Tak nám zabili NetInfo, paní Müllerová