Pretraživanje i obrada tekstualnih datoteka
Izdvajanje linija iz tekstualnih datoteka
-
regularni izrazi (regex ili regexp) su simbolička notacija koju koristimo za pretraživanja obrazaca unutar nekog teksta
- koriste se u mnogim alatima i programskim jezicima za rješavanje problema povezanih sa manipulacijom teksta
- regularni izrazi mogu varirati s obzirom na alat ili programski jezik
- razlikujemo dvije vrste znakova kod regularnih izraza
- regex != glob
-
grepsluži za izdvajanje linija prema određenom uzorku iz tekstualnih datoteka, primjer:grep "x" datoteka.txt # izdvaja linije koje sadrže slovo x u tekstualnoj datoteci datoteka.txt- ime dolazi od naredbe
g/re/p(global / regular expression / print) tradicionalnog Unix editoraed - navodnici su značajni: postoji velika razlika između
grep rij ec datoteka.txtigrep "rij ec" datoteka.txt - više detalja o naredbi pronađite na Wikipedijinoj stranici i u službenom priručniku
- ime dolazi od naredbe
-
[chars]-- jedan znak, bilo koji od navedenih u zagradama- kao i glob, podržava i sintaksu oblika
[A-Z],[a-z],[0-9]
- kao i glob, podržava i sintaksu oblika
-
[^chars]-- jedan znak, bilo koji osim navedenih u zagradama .-- jedan znak, bilo koji^-- početak retka$-- kraj retka-
poznajemo dvije vrste regularnih izraza: basic regular expressions (BRE) i extended regular expressions (ERE)
- razlikuju se u interpretaciji posebnih znakova
- BRE: ^ $ . [ ] *
- ERE: ( ) { } ? + |
- grep je program koji koristi BRE
grep -E '(xd|xy)' dat.txt
-
*-- nijedno, jedno ili bilo koliko ponavljanja prethodnog znaka (npr..*je bilo koliko ponavljanja bilo kojeg znaka) +-- jedno ili bilo koliko ponavljanja prethodnog znaka (ali ne niti jedno!)?-- jedno ili nijedno ponavljanje prethodnog znaka-
{n,m}-- element koji prethodi mora se pojaviti određen broj puta- specijalni slučajevi
{n},{n,},{,m}
- specijalni slučajevi
-
(ab|cd)-- predstavlja alternaciju tj. uzorak mora sadržavati ili nizabilicd - puno više o regularnim izrazima čuti ćete na kolegijima Formalni jezici i jezični procesori 1 i 2
Zadatak
-
Stvorite datoteku
mjeseci.txtu koju ćete, u svaki red posebno, zapisati sve mjesece u godini i sve dane u tjednu. Zatim iz nje izdvojite sljedeće linije:- sve koje sadrže slovo
a; - sve koje sadrže slovo
Oilio; - sve koje ne sadrže slovo
i; - sve koje sadrže niz znakova an i još barem jedno slovo nakon
n; - sve koje počinju slovom
Silis; - sve koje imaju točno 8 slova.
- sve koje sadrže slovo
-
Napravite datoteku
adrese1.txti u nju upišite sljedeće e-mail adrese (svaka u svome retku):peric.hrvoje@mail.net nekiMail@inet.hr mail1@t-com.net Miro-gavran@gmail.com mail25@yahoo.com mail18@bnet.hr Vedran.miletic@inf.uniri.hr vperovic@mail.com pposcic2@net.hr -
Izdvojite iz datoteke
adrese1.txtadrese koje:- koriste bar jedno veliko slovo u korisničkom imenu;
- završavaju na
.hrili.com; - čije se korisničko ime sastoji od točno 8 slova;
- počinju sa bilo kojim slovom koje se u abecedi nalazi nakon slova
o; - koriste znak
.ili--u korisničkom imenu; - čije korisničko ime ne završava brojem;
- sadrže slovo
v, nakon kojeg slijedi nizic(koji se može ponavljati više puta), a iza kojeg odmah slijedi znak@; - su oblika
mail(broj<5)(broj>7).
Dodatni zadatak
Napravite datoteku studenti.txt u koju napišite popis studenata prisutnih na satu u formatu Ime Prezime, pri čemu je svaki student u svom redu te datoteke. Izdvojite iz nje:
- sve studente kojima prezime počinje na
P, - sve kojima prezime počinje slovom koje je dio hrvatske abecede,
- sve kojima ime počinje hrvatskim dijakritičkim znakom,
- sve koji nemaju hrvatski dijakritički znak ni u imenu ni u prezimenu,
- sve kojima ime počinje na
P, a prezime završava nać, - sve čije prezime ima točno 6 slova, ali zadnje nije
ć.
Napomene:
\(abc\)čini da se niz znakovaabctretira kao cjelina, može se koristiti u kombinaciji sa*i+,\(abc\|de\)ima značenje nizabcili nizde,.i-dobijemo kao\\.i\\-respektivno (jedan escape "pojede" ljuska, drugi se prosljeđuje grepu), a unutar zagrada[]escape nije potreban,\dobijemo kao\\\\.
Dodatni zadatak
Iz datoteke mjeseci.txt u koju ste upisali nazive mjeseca u godini izdvojite:
- sve mjesece koji sadrže slovo
a, - sve mjesece koji sadrže niz znakova
an, - sve mjesece koji ne sadrže slovo
e.
Obrada tekstualnih datoteka
-
sedje skraćenica od stream editor- dozvoljava rad nad nizom podataka
- podaci sa standardnog ulaza uređuju se prema prethodno napisanim uputama, naredbama spremljenim u datoteku i prosljeđuju se na standardni izlaz
- više detalja o naredbi pronađite na Wikipedijinoj stranici i u službenom priručniku ili tutorialu Brucea Barnetta
sed nudi dvije osnovne mogućnosti primjene.
-
sedza zamjenu (s); primjer:sed 's/dan/noć/' text1.txt # mijenja slijed dan za noć u datoteci text1.txt- koristi se zajedno sa regularnim izrazima, kao i kod naredbe
grep, za zamjenu traženog uzorka, zadanim uzorkom - sintaksa:
sed 's/traženiUzorak/zamjenskiUzorak/' file.txt
- koristi se zajedno sa regularnim izrazima, kao i kod naredbe
-
sedza transformaciju (y); primjer:sed 'y/aeiou/AEIOU/' file1.txt # zamjenjuje svako od navedenih malih slova s odgovarajućim velikim slovom- svaki se traženi znak zamjenjuje odgovarajućim zadanim znakom
- sintaksa:
sed 'y/uzorak1/uzorak2/' file.txt
Najčešće korišteni parametri naredbe sed su:
-
sed -nčini da ne ispisuje na ekranu nikakav tekst, osim ako to nije eksplicitno navedeno zastavicom (po defaultusedispisuje sve na ekran)- ako se
-nopcija ne koristi,sedje vrlo sličan naredbicat
- ako se
-
sed -ekoristi se za višestruku obrada- koristi se kada imamo više naredbi za
sedprije prvog delimitatora (npr.sed -e 's/a/A/' -e 's/e/E/')
- koristi se kada imamo više naredbi za
Zadatak
Napravite datoteku dani.txt koja će sadržavati sve dane u tjednu (jedan ispod drugoga).
- zamijenite riječ
utoraksadrugi, - koristeći samo jednu naredbu
sed, zamijenite riječsubotasapočetak, anedjeljasakraj, - transformirajte svaki samoglasnik u slovo koje se po abecedi nalazi iza njega
Napomena: poslije zadnjeg delimitatora dodajte g; g s y ne funkcionira, funkionira samo sa s.
Zadatak
Iz sustava MudRi preuzmite datoteku receniceSED.txt i sačuvajte ju u svom kućnom direktoriju. Zatim:
- zamijenite svaku riječ koja počinje sa
an, a završava na samoglasnik, sa rječjuBRAVO. Možete li to učiniti?, - svaku rečenicu koja sadrži broj, zamijenite sa rječju
RECENICA, - svako pojavljivanje znaka
ailiezamijenite saSAMae, a svaku pojavuoiliisaSAMoe, - izbrišite sve samoglasnike iz svih rečenica.
-
sedzastavice se dodaju nakon posljednjeg delimitatora (/)/g= zamjena svih pojavljivanja traženog uzorka/p= ispisuje se izmjenjena linija (usporedite rezultat sa i bez-n)/5= izmjenjuje 5. uzorak koji je pronađen/5g= izmjenjuje 5. uzorak i svaki poslije njega/w file.txt= određuje se odredišna datoteka u koju se upisuje rezultat naredbesed
-
zastavice se mogu kombinirati, no
/wmora biti na posljednjem mjestu - u kombinaciji s
yne koristimo zastavice
Zadatak
Koristite datoteku receniceSED.txt za sljedeći zadatak:
- zamijenite svaku (osim prve!) riječ koja počinje sa
aniliAna završava na suglasnik, sa rječjuBRAVO. Možete li to sada učiniti?, - svako pojavljivanje znaka
ailienakon njegova (ukupno) trećeg pojavljivanja zamijenite saSAMae, a svaku pojavuoiliisaSAMoe, - preuredite prvu naredbu tako da se na ekran ne ispisuje ništa osim promijenjenih linija, te da se samo izmjenjene linije upisuju u datoteku pod nazivom
receniceSED1.txt.
Zadatak
Napravite datoteku drzave.txt u kojoj upišite Hrvatska i nazive 6 zemalja s kojima graniči (svaku u svome redu). Zatim napravite sljedeće:
- Sve nazive država koje počinju slovom
Spromijeniti u naziv sas, upisati u datotekumaledrzave.txt, te prikazati promjene na ekranu. - Promijenite nazive svih država koje završavaju na
ijauZAMJENA, upisati rezultat u datotekuzam.txti onemogućiti ispis na ekranu. - Dodajte sljedeće države na popis: Kazahstan, Kirgistan, Uzbekistan, Afganistan, Pakistan i Turkmenistan, te zamijenite sve nazive koji završavaju na
stansanije susjed, ali samo nakon trećeg pojavljivanja tog uzorka, te ispišite sve, ne samo izmijenjene linije.
-
sedrestrikcije: navode se ispred izraza koji opisuje zamjenu ili transformaciju-
restrikcija broja retka
sed '3 s/[0-9]*//'-- brisanje prvog broja u trećem retkused '/^g/ s/Mark/Sonya/g'-- u svakom retku koji počinje sa slovom 'g' zamijeniti Mark sa Sonya
-
restrikcija prema rasponu retka
sed '1,100 s/a/A/g'-- zamjena 'a' sa 'A' vrši se u prvih 100 redaka (uočite da nije iskorišten znak ^)sed '21,$ s/a/A/g'-- zamjena 'a' sa 'A' se vrši od 21. retka do kraja datoteke
-
Zadatak
- Napišite
sednaredbu koja će prikazati sadržaj prvih 7 redaka datotekedrzave.txt. - Napišite
sednaredbu koja će u datoteci pretražiti pojavljivanja uzorkaani ispisati broj redaka pojave uzoraka. - Napišite
sednaredbu koja će u retcima koji završavaju slovomnmijenjati sva mala slova u velika slova. - Napišite naredbu kojom ćete u datoteci
drzave.txtpromijeniti svakoauA, tesuS, ali samo ako riječ u retku ima 8 slova.
Dodatni zadatak
- Stvorite datoteku
file1proizvoljnog sadržaja. - Napišite
sednaredbu koja će prikazati sadržaj prvih 7 redaka datotekefile1. - Napišite
sednaredbu koja će u recima koji završavaju sa slovombmijenjati sva mala slova u velika. - Napišite
sednaredbu koja će prikazati sadržaj datotekefile1tako da umjesto sadržaja redaka od 3. do 5. budu prazne linije. - Napišite
sednaredbu koja će prije linije ispisati i broj linije u kojoj mijenja sadržaj.
(Uputa: konzultirajte sed-ovu man stranicu.)
-
d,piqbez-n- navedene se naredbe vrlo posebno ponašaju kada se upotrebljavaju sa i bez
-n -
brisanje sa
d(briše linije od početka do kraja)sed '11,$ d' file.txt-- gleda samo prvih deset redaka, ostale zanemaruje (slično naredbihead)sed '1,10 !d' file.txt-- gleda samo prvih deset redaka, ostale zanemaruje (primjetite da ! znači negaciju)
-
ispis linija na ekranu sa
psed 's/dan/noć/p' text1.txt-- ispisuje sve što je u datotecitext1.txt, a promjene koje je napravio (prema uvjetu) ispisuje još jednomsed '1,10 p' file1.txt-- ispisuje prvih 10 redaka datotekefile1.txt
-
izlazak sa
qsed '11 q'-- prekida se izvođenje nakon obrade 11. retka
- navedene se naredbe vrlo posebno ponašaju kada se upotrebljavaju sa i bez
Dodatni zadatak
Dopunite sljedeću tablicu sa izlazima na ekranu, s obzirom na oblik sed naredbe:
| Sed parametri | Raspon | Naredb | Rezultat/ispis |
|---|---|---|---|
sed -n | 1,10 | p | Ispisuje samo prvih deset redaka |
sed -n | 11,$ | !p | |
sed | 1,10 | !d | |
sed | 11,$ | d | |
sed -n | 1,10 | !p | |
sed -n | 11,$ | p | |
sed | 1,10 | d | |
sed | 11,$ | !d | |
sed -n | 1,10 | d | |
sed -n | 1,10 | !d | |
sed -n | 11,$ | d | |
sed -n | 11,$ | !d | |
sed | 1,10 | p | |
sed | 11,$ | !p | |
sed | 1,10 | !p | |
sed | 11,$ | p |
Složenije izdvajanje i obrada teksta
awkje jezik za skriptiranje koji pruža složene mogućnosti uparivanja obrazaca-
awkse može koristiti za zamjenu riječi u nekoj tekstualnoj datoteci sa zadanim riječima ili se mogu vršiti izračuni koristeći brojeve koji su zapisani u nekoj datoteci; mi ćemo se zadržati na funkciji ispisa- sintaksa:
awk '{print <što se ispisuje>}' datoteka.txt - tekst koji želite ispisati (a nije dio datoteke) stavite u navodnike (npr. "Tekst")
- s opcijom
printi varijablama možemo koristiti i matematičke operatore+,-,*i/
- sintaksa:
-
awkobrađuje dokument liniju po liniju, a svakoj je riječi u liniji pridružena varijabla: prvoj $1, drugoj $2, itd.
Zadatak
Napravite datoteku recenice.txt koja ima dva retka riječi. U prvom retku neka se nalaze riječi voli, mrzi i putovati, a u drugom mrzi, kuhati, peglati i čitati. Koristeći naredbu awk napravite rečenice od zadanih riječi, tako da se u svakom retku koriste samo 1. i 3. riječ.
Napomena: ispis bi trebao izgledati ovako:
Moja prijateljica voli putovati.
Moja prijateljica mrzi peglati.
Zadatak
Napravite datoteku ucenici.txt u koju ćete zapisati ime i prezime nekoliko vaših kolega, te dodajte po dvije ocjene za svakoga (od 1 do 5). Koristeći naredbu awk ispišite:
-
prezime i sve ocjene za svakog učenika u datoteci, ispis neka bude oblika:
Učenik Prezime ima ocjena1 iz prvog predmeta, te ocjena2 iz drugog predmeta. -
ime i prvu ocjenu za svakog učenika, te zbroj ocjena, ispis neka bude oblika:
Učenik Ime ima ocjena1 iz prvog predmeta, a zbroj ocjena mu iznosi zbrojOcjena. -
ime, prezime, te prosječnu ocjenu za svakog studenta, ispis neka bude oblika:
Učenik Ime Prezime ima prosječnu ocjenu prosječnaOcjena.
-
trmijenja sve pojave jednog izraza ili znaka u neki drugi; primjer:cat file.txt | tr a-mA-Mn-zN-Z n-ZN-Za-mA-M # mijenja sva slova iz prvog intervala u odgovarajuća slova u drugom intervalu (šifrira tekst jednostavnom šifrom)- primjerice, može mijenjati sva velika slova u mala i obrnuto, slaže riječi u stupac i sl.
ToDo
Ovdje nedostaje zadatak.
Ostali alati za manipulaciju prikazom datoteka
-
lessje preglednik tekstualnih datoteka, koristan za hvatanje izlaza na kraju niza cijevi- osobito koristan za upotrebu kod ispisa veće količine podataka (
catbi prekrio nekoliko ekrana) - naziv
lessznači suprotno odmore, starijeg alata iste namjene, za razliku od kojeg omogućuje scrollanje teksta i "prema gore" (moreje omogućavao samo scrollanje "prema dolje")
- osobito koristan za upotrebu kod ispisa veće količine podataka (
Zadatak
- Otvorite pomoću programa
lessdatoteku/etc/passwdi pronađite pojavljivanje riječibinu istoj datoteci. Pronađite način da pomaknete na sljedeću pojavu traženog uzorka. (Uputa: pronađite u man stranici kako se radiSearch forwardiSearch backward.) - Iskoristite naredbu
Examineda bi otvorili i datoteku/etc/group.
headispisuje početni dio datoteke (zaglavlje), primjerice prvih 10 linijatailispisuje završni dio datoteke (podnožje), primjerice zadnjih 25 linija
Zadatak
-
Ukucajte naredbe
locale > postavke.txtilocale -m >> postavke.txtu komandnu liniju, pa zatim iz datotekepostavke.txt:- ispišite posljednjih 7 linija,
- ispišite prvih 20 linija.
-
Uočite što se događa s izlazom naredbe
tailukoliko vaša datoteka ima više od jedne prazne linije na kraju.
Pitanja za ponavljanje
- Što je
grep? - Zašto kažemo da globalni izrazi nisu isto što i regularni izrazi? Objasnite.
- Prisjetite se oznaka za regularne izraze.
- Što je BRE, a što ERE?
- Za što se koristi naredba
sed? - Što su zastavice kod naredbe
sed? Nabrojite ih nekoliko. - Koja zastavica kod naredbe
seduvijek mora biti na posljednjem mjestu kada ih više navodimo? Zbog čega? - Objasnite razliku između naredbi
headitail. - Kako biste opisali za što se koristi
less?
Author: Vedran Miletić, Vanja Slavuj, Sanja Pavkov