Section author: Vedran Miletić, Vanja Slavuj, Sanja Pavkov
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
[chars]
– jedan znak, bilo koji od navedenih u zagradamakao i glob, podržava i sintaksu oblika
[A-Z]
,[a-z]
,[0-9]
[^chars]
– jedan znak, bilo koji osim navedenih u zagradama.
– jedan znak, bilo koji^
– početak retka$
– kraj retkapoznajemo 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 putaspecijalni slučajevi
{n}
,{n,}
,{,m}
(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.
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 editordozvoljava 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 uzorkomsintaksa:
sed 's/traženiUzorak/zamjenskiUzorak/' file.txt
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
sed -e
koristi se za višestruku obradakoristi se kada imamo više naredbi za
sed
prije prvog delimitatora (npr.sed -e 's/a/A/' -e 's/e/E/'
)
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 mjestuu 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 transformacijurestrikcija 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
Dodatni zadatak
Dopunite sljedeću tablicu sa izlazima na ekranu, s obzirom na oblik sed
naredbe:
Sed parametri |
Raspon |
Naredba |
Rezultat/ispis |
---|---|---|---|
|
|
|
Ispisuje samo prvih deset redaka |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Složenije izdvajanje i obrada teksta¶
awk
je jezik za skriptiranje koji pruža složene mogućnosti uparivanja obrazacaawk
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 ispisasintaksa:
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/
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 cijeviosobito 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”)
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.
Ponovimo!
Š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
?