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
-
grep
služ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.txt
igrep "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 nizab
ilicd
- puno više o regularnim izrazima čuti ćete na kolegijima Formalni jezici i jezični procesori 1 i 2
Zadatak
-
Stvorite datoteku
mjeseci.txt
u 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
O
ilio
; - 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
S
ilis
; - sve koje imaju točno 8 slova.
- sve koje sadrže slovo
-
Napravite datoteku
adrese1.txt
i 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.txt
adrese koje:- koriste bar jedno veliko slovo u korisničkom imenu;
- završavaju na
.hr
ili.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 znakovaabc
tretira kao cjelina, može se koristiti u kombinaciji sa*
i+
,\(abc\|de\)
ima značenje nizabc
ili 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
-
sed
je 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.
-
sed
za 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
-
sed
za 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 defaultused
ispisuje sve na ekran)- ako se
-n
opcija ne koristi,sed
je vrlo sličan naredbicat
- ako se
-
sed -e
koristi se za višestruku obrada- koristi se kada imamo više naredbi za
sed
prije 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č
utorak
sadrugi
, - koristeći samo jednu naredbu
sed
, zamijenite riječsubota
sapočetak
, anedjelja
sakraj
, - 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
a
ilie
zamijenite saSAMae
, a svaku pojavuo
ilii
saSAMoe
, - izbrišite sve samoglasnike iz svih rečenica.
-
sed
zastavice 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
/w
mora biti na posljednjem mjestu - u kombinaciji s
y
ne koristimo zastavice
Zadatak
Koristite datoteku receniceSED.txt
za sljedeći zadatak:
- zamijenite svaku (osim prve!) riječ koja počinje sa
an
iliAn
a završava na suglasnik, sa rječjuBRAVO
. Možete li to sada učiniti?, - svako pojavljivanje znaka
a
ilie
nakon njegova (ukupno) trećeg pojavljivanja zamijenite saSAMae
, a svaku pojavuo
ilii
saSAMoe
, - 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
S
promijeniti u naziv sas
, upisati u datotekumaledrzave.txt
, te prikazati promjene na ekranu. - Promijenite nazive svih država koje završavaju na
ija
uZAMJENA
, upisati rezultat u datotekuzam.txt
i 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
stan
sanije susjed
, ali samo nakon trećeg pojavljivanja tog uzorka, te ispišite sve, ne samo izmijenjene linije.
-
sed
restrikcije: 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
sed
naredbu koja će prikazati sadržaj prvih 7 redaka datotekedrzave.txt
. - Napišite
sed
naredbu koja će u datoteci pretražiti pojavljivanja uzorkaan
i ispisati broj redaka pojave uzoraka. - Napišite
sed
naredbu koja će u retcima koji završavaju slovomn
mijenjati sva mala slova u velika slova. - Napišite naredbu kojom ćete u datoteci
drzave.txt
promijeniti svakoa
uA
, tes
uS
, ali samo ako riječ u retku ima 8 slova.
Dodatni zadatak
- Stvorite datoteku
file1
proizvoljnog sadržaja. - Napišite
sed
naredbu koja će prikazati sadržaj prvih 7 redaka datotekefile1
. - Napišite
sed
naredbu koja će u recima koji završavaju sa slovomb
mijenjati sva mala slova u velika. - Napišite
sed
naredbu koja će prikazati sadržaj datotekefile1
tako da umjesto sadržaja redaka od 3. do 5. budu prazne linije. - Napišite
sed
naredbu koja će prije linije ispisati i broj linije u kojoj mijenja sadržaj.
(Uputa: konzultirajte sed
-ovu man
stranicu.)
-
d
,p
iq
bez-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
p
sed '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
q
sed '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
awk
je jezik za skriptiranje koji pruža složene mogućnosti uparivanja obrazaca-
awk
se 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
print
i varijablama možemo koristiti i matematičke operatore+
,-
,*
i/
- sintaksa:
-
awk
obrađ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.
-
tr
mijenja 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
-
less
je preglednik tekstualnih datoteka, koristan za hvatanje izlaza na kraju niza cijevi- osobito koristan za upotrebu kod ispisa veće količine podataka (
cat
bi prekrio nekoliko ekrana) - naziv
less
znači suprotno odmore
, starijeg alata iste namjene, za razliku od kojeg omogućuje scrollanje teksta i "prema gore" (more
je omogućavao samo scrollanje "prema dolje")
- osobito koristan za upotrebu kod ispisa veće količine podataka (
Zadatak
- Otvorite pomoću programa
less
datoteku/etc/passwd
i pronađite pojavljivanje riječibin
u istoj datoteci. Pronađite način da pomaknete na sljedeću pojavu traženog uzorka. (Uputa: pronađite u man stranici kako se radiSearch forward
iSearch backward
.) - Iskoristite naredbu
Examine
da bi otvorili i datoteku/etc/group
.
head
ispisuje početni dio datoteke (zaglavlje), primjerice prvih 10 linijatail
ispisuje završni dio datoteke (podnožje), primjerice zadnjih 25 linija
Zadatak
-
Ukucajte naredbe
locale > postavke.txt
ilocale -m >> postavke.txt
u 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
tail
ukoliko 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
sed
uvijek mora biti na posljednjem mjestu kada ih više navodimo? Zbog čega? - Objasnite razliku između naredbi
head
itail
. - Kako biste opisali za što se koristi
less
?
Author: Vedran Miletić, Vanja Slavuj, Sanja Pavkov