Zpracování textu

21
Zpracování textu Regulární výraz Pro manipulaci s textem je v operačním systému UNIX k dispozici mimo editory řada filtrů, s jejichž pomocí lze upravovat obsah textových souborů. Ve všech těchto programech hraje významnou roli pojem regulární výraz. Je to syntaxe, která umožňuje specifikovat mnoho různých řetězců. Nejjednodušším regulárním výrazem je samotný řetězec: abcd1234 Takovému regulárnímu výrazu odpovídá jediný odpovídající řetězec: abcd1234 Pomocí operátorů můžeme rozšířit oblast platnosti regulárního výrazu. Jedním z nich je operátor . (tečka). Nahrazuje v regulárním výrazu libovolný znak.

description

Zpracování textu. Regulární výraz - PowerPoint PPT Presentation

Transcript of Zpracování textu

Page 1: Zpracování textu

Zpracování textu

Regulární výraz

Pro manipulaci s textem je v operačním systému UNIX k dispozici mimo editory řada filtrů, s jejichž pomocí lze upravovat obsah textových souborů. Ve všech těchto programech hraje významnou roli pojem regulární výraz. Je to syntaxe, která umožňuje specifikovat mnoho různých řetězců. Nejjednodušším regulárním výrazem je samotný řetězec:

abcd1234

Takovému regulárnímu výrazu odpovídá jediný odpovídající řetězec:

abcd1234

Pomocí operátorů můžeme rozšířit oblast platnosti regulárního výrazu. Jedním z nich je operátor . (tečka). Nahrazuje v regulárním výrazu libovolný znak.

Page 2: Zpracování textu

Regulární výraz Odpovídající řetězec

a.cd1234 aacd1234 a1cd1234… a!cd1234azcd1234 ...aAcd1234…aZcd1234

Operátor * zastupuje libovolněnásobný výskyt znaku předoperátorem.

ab* a (nulový počet znaků b)ab (jeden znak b)abbabbbabbbb...

Zpracování textu

Page 3: Zpracování textu

Spojením operátorů pro libovolný znak a jeho opakování vznikne operátor .*, který zastupuje libovolný řetězec.

x.* všechny řetězce začínající znakem x

Operátor [] (hranaté závorky) zastupuje kterýkoli znak uvedený mezi hranatými závorkami.

[sSt]ele seleSeletele

Operátor - (pomlčka) mezi hranatými závorkami vytváříinterval v rámci ASCII posloupnosti znaků.

[0-9] libovolná číslice [A-Za-z] libovolné písmeno

Zpracování textu

Page 4: Zpracování textu

Operátor ^ označuje začátek řádku, operátor $označuje konec řádku.

^x.*y$ jakýkoli řádek začínající na x a končící y

Pokud je potřeba uvést v regulárním výrazu některý ze speciálních znaků ., *, [, ], ^, \ nebo $, je potřeba je opatřit prefixem \. Jinou možností je uzavřít regulární výraz do apostrofů.

^\[.*$ řádky, které začínají znakem [

Regulární výrazy jsou klíčem ke zvládnutí nástrojů ke zpracování textu (grep, sed, awk, …), editorů a používají se i v shellu. Syntaxe regulárního výrazu v shellu se liší od syntaxe použité v prostředcích zpracování textu.

Zpracování textu

Page 5: Zpracování textu

Zpracování textu

Záznam, pole, oddělovač

Textové soubory jsou načítány a zpracovávány po záznamech (řádek). Oddělovačem záznamů je znak LF (line feed, ASCII 10), záznamy se člení na pole (slovo), oddělovačem polí jsou mezery a tabelátory. Filtry pro zpracování textu umožňují oddělovače předefinovat.

ymanak06:x:2208:30:Jiri Manak 4 46:/usr/people/students/ymanak06:/bin/kshykorab00:x:2195:30:Pavel Korabecny 5 48:/usr/people/students/ykorab00:/bin/ksh

Porovnávání souborů

Pro porovnávání souborů jsou k dispozici příkazy cmp (libovolné soubory) a diff (textové soubory). Příkaz cmp hlásí první první znak, v kterém se soubory liší, s přepínačem -l vypíše pro každý odlišný znak trojici čísel. První je pořadové číslo znaku, druhé je kód znaku v prvním souboru a třetí je kód znaku ve druhém souboru. Pokud jsou oba soubory shodné, nevypisuje cmp žádnou zprávu. Příkaz diff vypisuje všechny řádky, v nichž se soubory liší.

Page 6: Zpracování textu

Zpracování textu$ cat soubor1Prvni radekdruhy radekTreti radekDalsi radek$ cat soubor2Prvni radekDruhy radekTreti radekJiny radek$ cmp soubor1 soubor2soubor1 soubor2 differ: char 13, line 2$

$ cat soubor1Prvni radekdruhy radekTreti radekDalsi radek$ cat soubor2Prvni radekDruhy radekTreti radekJiny radek$ diff soubor1 soubor22c2< druhy radek---> Druhy radek4c4< Dalsi radek---> Jiny radek$

n1 a n2, n3 za řádek n1 prvního souboru je potřeba připsat řádky n2 až n3 druhého souborun1, n2 d n3 řádky n1 až n2 prvního souboru je třeba smazatn1, n2 c n3, n4 řádky n1 až n2 prvního souboru je třeba změnit tak, aby byly shodné s řádky n3 až n4 druhého souboru

Page 7: Zpracování textu

Zpracování textu

$ cat soubor1Prvni radekDruhy radekTreti radekJiny radek$ cat soubor2Prvni radekdruhy radekTretI radekJiny radek$ cmp -l soubor1 soubor2 13 104 144 29 151 111$

Page 8: Zpracování textu

Zpracování textu

S přepínačem -e vytváří příkaz diff přímo scénář využitelný editorem ed, který změní první soubor na druhý.

$ cat soubor1Prvni RadekJedna radektreti radekjiny radek$ cat soubor2Prvni radekDruhy radekTreti radekJiny radek$ diff -e soubor1 soubor2 > ed.scenar$ cat ed.scenar1,4cPrvni radekDruhy radekTreti radekJiny radek.$

$ (cat ed.scenar; echo w soubor3) | ed soubor14847$ diff soubor2 soubor3$

$ cat ed.scenar1,4cPrvni radekDruhy radekTreti radekJiny radek.w$

$ cat ed.scenar | ed soubor14847$ diff soubor1 soubor2$ cat > ed.scenar

Page 9: Zpracování textu

Zpracování textu

Prohledávání souboru

Pro prohledávání souborů se používá filtr grep ( modifikace fgrep a egrep). Filtr prohledává určené soubory a hledá v nich řádky, které obsahují zadaný regulární výraz. Nalezené řádky vypisuje na standardní výstup. Obecný formát:

grep [-přepínače] regulární_výraz seznam_souborů

Regulární výraz je zadáván v syntaxi obvyklé pro editor ed.

-v tiskne jen řádky, které neobsahují hledaný řetězec-i ignoruje při hledání rozdíl mezi malými a velkými písmeny-n píše k výstupním řádkům jejich pořadové číslo v souboru

fgrep - nepřipouští regulární výraz, rychlejší algoritmusegrep - rozšířený grep, doplňuje operátory pro vytváření regulárního výrazu

+ - jeden nebo několik výskytů předcházejícího znaku| - volba mezi dvěma výrazy? - žádný nebo jednonásobný výskyt předcházejícího znaku

Page 10: Zpracování textu

$ cat grepTento textslouzi k priblizenifunkceprikazu grep$ cat grep1Prikaz grepslouzi k vyhledavaniretezcuv zadanem textu$ grep t.x grep*grep:Tento textgrep1:v zadanem textu$ fgrep t.x grep*$ fgrep tex grep*grep:Tento textgrep1:v zadanem textu$

$ cat grepTento textslouzi k priblizenifunkceprikazu grep$ cat grep1Prikaz grepslouzi k vyhledavaniretezcuv zadanem textu$ egrep 'ret|rep' grep*grep:prikazu grepgrep1:Prikaz grepgrep1:retezcu$

$ cat egrepahoj jak se mas?!gfgfgfg kjkjk @hhhhh8dobry den!& nnnnnn$ egrep -n ! egrep2:!gfgfgfg kjkjk4:8dobry den!$ egrep -n '^!' egrep2:!gfgfgfg kjkjk$

Page 11: Zpracování textu

Zpracování textu

Třídění souborů

Třídění se provádí příkazem sort, probíhá podle ASCII kódu, pokud potřebujeme třídit podle velikosti čísel, je potřeba jej spustit s přepínačem -n.

$ cat cisla89520011223681011000210$

$ sort cisla11010001122002102356889$

$ sort -n cisla15102368891122002101000$

Page 12: Zpracování textu

Zpracování textu

Implicitně třídí sort podle prvních (druhých, třetích, …) znaků. Pomocí argumentů ve tvaru +n, -n lze příkazu sort předepsat, které znaky má uvažovat při třídění. Argument -n neznamená, že pro třídění bude použito pouze n+1 pole, ale n+1 a další pole. Pokud chceme určit, podle kterých polí bude třídění probíhat, musíme použít argument -n. Argumenty +n a -n mohou mít tvar pole.znak. Jiný než implicitní oddělovač polí se zadává pomocí přepínače -t.

-t zadání oddělovače-r reverzní třídění-f ignoruje velikost písmen

$ cat seznamPilny Oto vedouci 156987 56Zaruba Zdenek manager 156987 21Pritulny Ivo referent 548766 54Bezzemek Jan referent 211100 1Kytlink Zdenek referent 111287 99Horn Rene skladnik 226544 22$

$ sort seznamBezzemek Jan referent 211100 1Horn Rene skladnik 226544 22Kytlink Zdenek referent 111287 99Pilny Oto vedouci 156987 56Pritulny Ivo referent 548766 54Zaruba Zdenek manager 156987 21$

Page 13: Zpracování textu

Zpracování textu

$ cat seznamPilny Oto vedouci 156987 56Zaruba Zdenek manager 156987 21Pritulny Ivo referent 548766 54Bezzemek Jan referent 211100 1Kytlink Zdenek referent 111287 99Horn Rene skladnik 226544 22$ sort +1 seznamPritulny Ivo referent 548766 54Bezzemek Jan referent 211100 1Pilny Oto vedouci 156987 56Horn Rene skladnik 226544 22Zaruba Zdenek manager 156987 21Kytlink Zdenek referent 111287 99$

$ sort +1 -2 seznamPritulny Ivo referent 548766 54Bezzemek Jan referent 211100 1Pilny Oto vedouci 156987 56Horn Rene skladnik 226544 22Kytlink Zdenek referent 111287 99Zaruba Zdenek manager 156987 21$

Page 14: Zpracování textu

Zpracování textu

$ sort +2.2 seznamZaruba Zdenek manager 156987 21Pilny Oto vedouci 156987 56Kytlink Zdenek referent 111287 99Bezzemek Jan referent 211100 1Pritulny Ivo referent 548766 54Horn Rene skladnik 226544 22$

$ sort -t: +4 uzivyhrusk01:x:2267:30:David Hruska 4 46:/usr/people/students/yhrusk01:/bin/kshyschac00:x:2268:30:David Schachl 4 47:/usr/people/students/yschac00:/bin/kshykosou01:x:2263:30:Frantisek Kosour 4 48:/usr/people/students/ykosou01:/bin/kshyceplm00:x:2264:30:Jaroslav Cepl 2 B31:/usr/people/students/yceplm00:/bin/kshycasla01:x:2266:30:Jiri Caslava 4 46:/usr/people/students/ycasla01:/bin/kshymanak06:x:2208:30:Jiri Manak 4 46:/usr/people/students/ymanak06:/bin/kshychyle00:x:2265:30:Ladislav Chylek 4 46:/usr/people/students/ychyle00:/bin/kshykorab00:x:2195:30:Pavel Korabecny 5 48:/usr/people/students/ykorab00:/bin/kshybilek03:x:2262:30:Petr Bilek 4 48:/usr/people/students/ybilek03:/bin/kshycacka00:x:2261:30:Petr Cacka 4 49:/usr/people/students/ycacka00:/bin/kshsitea:x:2269:30:vyukovy ucet pro site:/usr/people/students/sitea:/bin/ksh$

Page 15: Zpracování textu

Zpracování textu

Příkazy cut a paste

Pomocí příkazu cut můžeme z každého řádku souboru vzít pouze jeho část. Implicitním oddělovačem polí je tabelátor (!). Pomocí přepínače -f můžeme určit, která pole chceme zpracovat. Jiný než implicitní oddělovač se zadává pomocí přepínače -d.Pomocí příkazu paste se mohou v souboru spojit pole v jiném pořadí. Oddělovačem ve složeném souboru je tabelátor, případnou změnu oddělovače opět zadáváme pomocí přepínače -d.

$ cat seznamPilny Oto vedouci 156987 56Zaruba Zdenek manager 156987 21Pritulny Ivo referent 548766 54Bezzemek Jan referent 211100 1Kytlink Zdenek referent 111287 99Horn Rene skladnik 226544 22

Page 16: Zpracování textu

Zpracování textu

$ cut -f1 seznamPilny OtoZaruba ZdenekPritulny IvoBezzemek JanKytlink ZdenekHorn Rene

$ cut -f3 seznam156987156987548766211100111287226544

$ cut -f1,3 seznamPilny Oto 156987Zaruba Zdenek 156987Pritulny Ivo 548766Bezzemek Jan 211100Kytlink Zdenek 111287Horn Rene 226544

$ cut -d: -f1,2,5 uzivycacka00:x:Petr Cacka 4 49ybilek03:x:Petr Bilek 4 48ykosou01:x:Frantisek Kosour 4 48yceplm00:x:Jaroslav Cepl 2 B31ychyle00:x:Ladislav Chylek 4 46ycasla01:x:Jiri Caslava 4 46yhrusk01:x:David Hruska 4 46ymanak06:x:Jiri Manak 4 46ykorab00:x:Pavel Korabecny 5 48

Page 17: Zpracování textu

Zpracování textu

$ cut -f1,2 seznam > jm.prof$ cut -f3 seznam > cislo$ paste cislo jm.prof > novy.seznam$ cat novy.seznam156987 Pilny Oto vedouci156987 Zaruba Zdenek manager548766 Pritulny Ivo referent211100 Bezzemek Jan referent111287 Kytlink Zdenek referent226544 Horn Rene skladnik$

$ paste -d* cislo jm.prof156987*Pilny Oto vedouci156987*Zaruba Zdenek manager548766*Pritulny Ivo referent211100*Bezzemek Jan referent111287*Kytlink Zdenek referent226544*Horn Rene skladnik$

$ tty/dev/ttyq3$ tty | cut -c5-8/tty$ tty | cut -c6-ttyq3$

Obdobně lze používat i v případě přepínače -f

Page 18: Zpracování textu

Zpracování textu

Programovatelný filtr awk

Jedná se o programovací jazyk (?), který pracuje se záznamy a poli, je pomalejší než vyšší programovací jazyky, dá se přepsat do jazyka C.

awk -f scénář.awk vstupní_soubory

Struktura programu

Program pro awk se skládá z dvojic vzor {činnost}. Vzor určuje záznam (obvykle řádek), na kterém se činnost provede. Jestliže není vzor uveden, provádí se činnost na všech záznamech. Implicitní činností je výpis záznamu na standardní výstup. Implicitním oddělovačem polí jsou mezery a tabelátory, impicitním oddělovačem záznamů je nový řádek. Jednotlivá pole jsou přístupná prostřednictvím $1, $2, … Proměnná $0 obsahuje celý záznam.

Page 19: Zpracování textu

Zpracování textu

$ cat scenar1{print $2,$1" "$4}$ cat seznam1Pilny Oto vedouci 41142245 1965 22548Zaruba Zdenek manager 41142698 1955 15368Pritulny Ivo referent 41146987 1956 12569Bezzemek Jan referent 41143658 1956 12548Kytlink Zdenek referent 41142522 1968 10258Horn Rene skladnik 41145544 1977 8256$ cat scenar1{print $2,$1" "$4}$ awk -f scenar1 seznam1Oto Pilny 41142245Zdenek Zaruba 41142698Ivo Pritulny 41146987Jan Bezzemek 41143658Zdenek Kytlink 41142522Rene Horn 41145544$

Argumenty příkazu print mohou být odděleny čárkou (mezera) nebo tabelátorem (přehlednější výstup).

Page 20: Zpracování textu

Zpracování textu

$ cat scenar2/referent/ {print $2,$1" "$6",- Kc"}$ awk -f scenar2 seznam1Ivo Pritulny 12569,- KcJan Bezzemek 12548,- KcZdenek Kytlink 10258,- Kc$ cat scenar3/referent/ || /manager/ {print $2,$1" "$6",- Kc"}$ awk -f scenar3 seznam1Zdenek Zaruba 15368,- KcIvo Pritulny 12569,- KcJan Bezzemek 12548,- KcZdenek Kytlink 10258,- Kc$

Vzor je uzavřen mezi znaky / (viz. ed), lze použít libovolný regulární výraz, mohou se používat logické operátory ! (negace), || (logický součet), && (logický součin), () (úprava priority vyhodnocování). Porovnání se vzorem lze omezit pouze na některá pole pomocí operátoru ~ (!~).

Page 21: Zpracování textu

Zpracování textu

$ cat scenar4$5~/1956/ {print $0",- Kc"}$ awk -f scenar4 seznam1Pritulny Ivo referent 41146987 1956 12569,- KcBezzemek Jan referent 41143658 1956 12548,- Kc$ cat scenar4$5!~/1956/ {print $0",- Kc"}$ awk -f scenar4 seznam1Pilny Oto vedouci 41142245 1965 22548,- KcZaruba Zdenek manager 41142698 1955 15368,- KcKytlink Zdenek referent 41142522 1968 10258,- KcHorn Rene skladnik 41145544 1977 8256,- Kc$

\b backspace \f nová stránka\n nový řádek \r návrat vozíku\t tabelátor \ooo znak s oktalovou\" uvozovky hodnotou

$ cat scenar4{print $1"\t\101\40\102"}$ awk -f scenar4 seznam1Pilny A BZaruba A BPritulny A BBezzemek A BKytlink A BHorn A B$