Sunteți pe pagina 1din 17

Laboratorul 3

Procesare de text
Tutorial

I. Expresii Regulate
Din mediul Windows deschideti pagina:
http://regexpal.com/
RegexPal este un tester online pentru expresii regulate. Testerul dispune de
doua casete text: pentru introducerea de expresii regulate (caseta de sus) si
pentru introducerea textului pe care vrem sa testam expresiile regulate
(caseta de jos).
Dupa completarea celor doua casete text vor fi evidentiate cuvintele care sunt
compatibile cu expresia regulata scrisa.
NOTA: Pentru a folosi metacaracterele . $ si ^ bifati casetele de sus:
# match at line breaks
# dot matches all

Caractere simple
In campul pentru text:
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
In campul pentru expresii (pe rand una din expresiile de mai jos):
-m
- Mary
- had a

Cea mai simpla expresie regulata este cea care contine caractere simple.
Orice cuvant din textul tinta care contine caracterele in ordinea din expresie
va fi un match. Un caracter lower case nu este identic cu unul upper case.
Atentie caracterul
separator!).

spatiu

este inclus in forma expresiei(nu este

un

Caractere "escapate"
In campul text:
Caracterele speciale vor fi escapate.*
In campul pentru expresii:
- .*
- \.\*
Exista cateva caractere care au functii speciale. Daca insa ne dorim sa le
folosim ca si caractere normale trebuie sa le prefixam cu un backslash (\).
Atentie caracterul backlash este un metacaracter si trebuie escapat daca
vrem sa il folosim ca si character normal. \\.

Caractere pozitionale
In campul pentru text:
Mary had a little lambie.
And everywhere that Mary
went, thelamb was sure
to go
Atentie intre cuvintele the si lamb nu este spatiu.
In campul pentru expresii:
- ^Mary
- Mary$

- \blamb\b
Caracterul ^ (caret) marcheaza inceputul de linie si $ (dollar sign) marcheaza
sfasitul acesteia. Limita unui cuvant este marcata prin \b care tine loc de
spatiu, tab, newline si caractere de punctuatie.

Caracterul de continut
In campul pentru text:
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
In campul pentru expresii:
- .a
Caracterul punct (.) poate semnifica orice caracter. In mod normal nu tine
locul caracterlui newline, dar in unele utilitare de prelucrare text se poate
forta acest lucru.

Intervale de valori
In campul pentru text:
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
In campul pentru expresii:
- [a-z]a
Unei pozitii (caracter) din expresie ii se poate asigna un set de valori cu
ajutorul parantezelor drepte ([ si ]). Valorile pot avea forma unui interval
sau a unei multimi.

Expresia de mai sus va selecta toate literele lower case care au langa ele
caracterul a. Se poate selecta un spatiu prin \s sau o cifra prin \d.

Operatorul de complementare
In campul text:
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
In campul pentru expresii:
- [^a-z]a
Simbolul caret are semnificatii diferite. In majoritatea cazurilor tine locul
inceputului de linie. Daca apare la inceputul unui set neaga setul de valori
(toate caracterele cu exceptia celor din set sunt luate in considerare).
Atentie! Caracterele lower case sunt diferite de cele upper case. ( [A-Z] !=
[a-z] )

Alternarea sabloanelor
In campul pentru text:
Unu, doi, trei la perete stai!
In campul pentru expresii:
- unu|doi|trei
Vor fi selectate toate cuvintele care se potrivesc cu unul din sabloanele
inlantuite prin ("|").

Operatori de multiplicare
In campul pentru text:
AAAD

ABBBBCD
BBBCD
ABCCD
AAABBBC
In campul pentru expresii:
- A+B*C?D
Operatorii de multiplicare se aplica asupra caracterului din stanga lor si au
urmatoarea semnificatie: ("+") are semnificatia "odata sau de mai multe ori",
("?") "de zero sau o singura data", ("*") "de zero sau mai multe ori".
Daca nu exista operatori de multiplicare fiecare caracter este luat o singura
data.

Multiplicatori numerici (expresii regulate extinse)


In campul pentru text:
aaaaa bbbbb ccccc
aaa bbb ccc
aaaaa bbbbbbbbbbbbbb ccccc
In campul pentru expresii:
- a{5}
- b{6}
- c{4,8}
Cu ajutorul parantezelor acolade ("{" si "}") se poate specifica un numar
exact de repetitii ({n}) sau un interval ({n,m}).

II. Editor de streamuri


Sed
Sed este un editor de streamuri text care permite aplicarea unor operatii de
baza asupra unui text primit ca stream, fie dintr-un fisier ce trebuie prelucrat
fie dintr-un pipe (output-ul unei alte comenzi).

Exemple de aplicatii:
Substitutie
Sintaxa standard pentru substituie este urmatoarea:

sed 's/old_seq/new_seq/'

< old_file > new_file

Comanda de mai sus va trimite catre sed continutul fisierului old_file prin
redirectare (operatorul <). Sed va inlocui in streamul primit prima aparitie a
secventei old_seq cu secventa new_seq iar streamul astfel mofificat va fi
salvat, tot prin redirectare ( operatorul >), in fisierul new_file.
In formatul instructiunii distingem 4 parti:

s: comanda pentru substitutie


 /../../: delimitatori
 old_seq: secventa de inlocuit (care poate fi o expresie regulata)
 new_seq: secventa inlocuitoare


Observatie! Delimitatorii pot fi schimbati.


delimitator caracterul de dupa comanda.

In

principiu

se

considera

Conventional este folosit caracterul slash ("/") dar in unele situatii este util sa
folosim un altul. Spre exemplu daca dorim sa schimbam o cale catre un
director primita dintr-un stream.
Daca folosim delimitatorul slash ("/"):
$ sed 's/\/usr/\local\/bin\/\/common\/bin/'<old_file >new_file
Daca folosim delimitatorul (:):

$ sed 's:/usr/local/bin/:/common/bin/:' <old_file >new_file


In cazul in care vrem sa inlocuim o expresie regulata cu o varianta a sa usor
modificata (vrem spre exemplu sa o punem intre paranteze) putem sa folosim
operatorul ("&") ca referinta.
Exemplu:
$ echo "123 abc" | sed 's/[0-9][0-9]*/& & & & &/'
123 123 123 123 123 abc
Se va inlocui secventa care se potriveste cu expresia regulata cu un sir de
cinci secvente identice cu ea.

Substitutie globala
In cazul in care vrem sa aplicam substituia pe toate matchurile expresiei
regulate folosim switchul /g.
$ echo "123 99 abc" | sed 's/[0-9][0-9]*/& &/g'
123 123 123 123 123 99 99 99 99 99 abc

Afisare
In mod obisnuit sed afiseaza continutul intregului stream dupa modificare. In
cazul in care vrem sa afiseze doar liniile care urmeaza un anumit pattern
(functionalitate asematoare cu grep):

sed -n 's/pattern/&/p' <file


Prin switchul -n se anuleaza optiunea default de printare a intregului stream.
Astfel pentru salvarea modificarilor intr-un alt fisier se va folosi optiunea w:

sed -n 's/old_seq/new_seq/w new_file' <old_file

Restrictii
Cele mai simple restrictii se pot aplica la nivel de linie. Spre exemplu daca
vrem sa stergem primul numar de pe linia 3 :
$ sed '3 s/[0-9][0-9]*//' <old_file >new_file

Daca vrem sa stergem toata linia 3 folosim comanda d:


$ sed '3 d' <old_file >new_file
Pentru un interval de linii ( se considera [n,m) ):
$ sed '3,7 d' <old_file >new_file
Pentru a mentiona ultima linie din fisier folosim caracterul $.
$ sed '3,$ d' <old_file >new_file

Intervalul de aplicare poate fi specificat si prin expresii regulate:

sed '/start/,/stop/ s/pattern//'


Aceasta comanda sterge toate aparitiile lui "pattern" de la intalnire expresiei
"start" pana la intalnirea expresiei "stop".

Negarea restrictiei
Deseori este necesar sa prelucram anumite linii cu exceptia celor aflate intrun interval. Inversarea restrictiei se face cu ajutorul operatorului ("!").
$ sed -n '/match/ !p' <old_file
Exemplul de mai sus printeaza toate liniile mai putin cele care se potrivesc cu
sablonul "match".

Comanda Quit
Un alt un mod prin care putem sa restrangem aplicarea operatiilor este
comanda q (quit).
$ sed '11 q' <file
Afiseaza primele 10 linii din fisier.

III. Procesare de fisiere


Cateva dintre exemplele de mai jos folosesc urmatoarele fisiere:

file1

file2

file3

Tom 123 Main


Dick 4787 West
Harry 98 North
Sue 1035 Cooper

Tom programmer
Dick lawyer
Harry artist

Mary
had
a
little
lamb
Mary
Mary

Head
Format: head [optiuni] [fisier]
Actiune: Afiseaza inceputul unui fisier (implicit primele 10 linii).
Optiuni importante:
-c <num>, --bytes=<num>
afiseaza primii <num> bytes din fisier
-n <num>, --lines=<num>
afiseaza primele <num> linii din fisier
Exemplu:
$ head -2 file1
Tom 123 Main
Dick 4787 West

Tail
Format: tail [optiuni] [fisier]
Actiune: Afiseaza sfarsitul unui fisier (implicit ultimele 10 linii).
Optiuni importante:
-f, --follow
ramane deschis pentru afisare
--pid=<pid>
se termina follow atunci cand <pid> se termina

Exemplu:
$ tail -2 file1
Harry 98 North
Sue 1035 Cooper

Sort
Format: sort [optiuni] [fisier]
Actiune: Sorteaza inputul dupa un anumit criteriu.
Optiuni importante:
-f, --ignore-case
-n, --numeric-sort
-r, --reverse
-k <field>, --key=<field>
stabileste campul dupa care se face sortarea
Exemplu:
$ sort -n -k 2 file1
Harry 98 North
Tom 123 Main
Sue 1035 Cooper
Dick 4787 West

Uniq
Format: uniq [optiuni] [input [output]]
Actiune: Elimina liniile duplicate succesive primite de la input (sau stdin) si
scrie rezultatul in output (sau stdout).
Optiuni importante:
-u afiseaza doar liniile distincte
-d afiseaza doar duplicatele
-c numara aparitiile
Exemplu:
$ sort file3 | uniq
a
lamb
little
had
Mary

10

Nl
Format: nl [optiuni] [fisier]
Actiune: Numeroteaza liniile din input.
Optiuni importante:
-h <style>, -b <style>, -f <style>
stabileste stilul de numerotare pentru antet, corp si subsol
style: a - le numeroteaza pe toate; t - le numeroteaza pe cele care nu
sunt albe; n - nu le numeroteaza
-n <format>, --number-format=<format>
format: ln - alinere la stanga; rn - aliniere la dreapta; rz - aliniere la
dreapta cu padding de zerouri
-i line increment
Exemplu:
$ nl file1
1
Tom 123 Main
2
Dick 4787 West
3
Harry 98 North
4
Sue 1035 Cooper

Expand / unexpand
Format: expand [optiuni] [fisier] / unexpand [optiuni] [fisier]
Actiune: Converteste taburile in spatii. / Converteste spatille in taburi
Optiuni importante:
-t <num>, --tabs <num>
modifica numar de spatii dintr-un tab, implicit 8

Tr
Format: tr [optiuni] set1 [set2]
Actiune: Traduce o secventa de caractere, inlocuidu-le pozitional cu
caracterele din alt set primit ca parametru.
Optinui importante:
-t, --truncate-set1
-d sterge caracterele din setul 1
Exemplu:
$ echo "to upper case" | tr "a-z" "A-Z"
TO UPPER CASE

11

Wc
Format: wc [optiuni] [fisier]
Actiune: Realizeaza statistici legate de fisier.
Optiuni importante:
-l, --lines
-c, --bytes
-L, --max-line-length
-w, --words
-m, --chars
Exemplu:
$ wc -l file1 #
4 file1
$ wc -w file1 #
12 file1
$ wc -m file1 #
60 file1
$ wc file1
#
4
12

afiseaza numarul de linii


afiseaza numarul de cuvinte
afiseaza numarul de caractere
afiseaza numarul de linii, cuvinte si caractere
60 file1

Cat / tac
Format: cat [optiuni] [fisier] / tac [optiuni] [fisier]
Actiune: Concateneaza outputul mai multor fisiere primite ca parametru./
Concateneaza fisierele in ordinea inversa a liniilor.
Optiuni importante:
-E, --show-ends
marcheaza sfasitul de linie cu $
-n, --number
numeroteaza liniile
-s, --sqeeze-blank
comprima spatiile intr-unul singur
-T, --show-tabs
marcheaza taburile cu ^I
-v, --show-nonprinting
afiseaza caracterele de control

Split
Format: split [option] [input [prefix]]
Actiune: Segmenteaza un fisier in mai multe fisiere.
Optiuni importante:
-b <size>, --bytes=<size>

12

-c <size>, --line-bytes=<size>
-l <lines>, --lines=<lines>
-d, --numeric-suffixes
default prefix: x
default suffixes: aa,ab,ac ...

Pr
Format: pr [optiuni] [fisier]
Actiune: Pregateste un fisier pentru imprimare
Optinuni importante:
-l <lines>, --length=<lines>
stabileste lungimea unei pagini
-h <text>, --header=<text>
stabileste textul pentru antet
-o <chars>, --indent=<chars>
stabileste dimensiunea marginii stangi
-w <chars>, --width=<chars>
stabileste latimea unei pagini

Fmt
Format: fmt [optiuni] [fisier]
Actiune: Formateaza textul.
Optiuni importante:
-w <width>
-t, --tagged-paragraph
indentarea primei linii

Od
Format: od [optiuni] [fisier]
Actiune: Afiseaza continutul fisierului in octal si alte baze de numeratie
Optiuni importante:
-t <type>
type: d2 - decimal shorts, d4 - decimal longs
x2 - hexadecimal shorts, x4 - hexadecimal longs
o2 - octal shorts (default), o4 - octal longs

13

Cut
Format: cut optiuni [fisier]
Actiune: Extrage sectiuni din fiecare linie a fisierului primit ca parametru
Optiuni importante:
-b <list>, --bytes=<list>
-c <list>, --characters=<list>
-f <list>, --fields=<list>
-d <char>, --delimitter=<char>
delimitator default este tab
-s, --only-delimited
Exemplu:
$ cut -d " " -f2 file1
123
4787
98
1035

Paste
Format: paste [optiuni] [fisiere]
Actiune: Concateneaza fisiere linie cu linie
Optiuni importante:
-d <list>, --delimiters=<list>
delimitator default este tab
-s, --serial
pune fiecare fisier pe linie
Exercitii:
$ paste file1 file2
Tom 123 Main
Tom programmer
Dick 4787 West Dick lawyer
Harry 98 North Harry artist
Sue 1035 Cooper

Join
Format: join [optiuni] fisier1 fisier2
Actiune: Concateneaza continutul a doua fisiere pe baza unor campuri
comune
Optiuni importante:
-t <char>
stabileste separatorul de camp, implicit este spatiu

14

-i
ignore case
-1 n, -2 m
specifica numerele de ordine al campului comun in cele doua fisiere
Exemplu:
$ join -1 1 -2 1 file1 file2
Tom 123 Main programmer
Dick 4787 West lawyer
Harry 98 North artist

IV. Vim
Vim este un editor modal (apasarea unei taste are efecte diferite in functie de
modul in care se lucreaza).
Urmariti pasii urmatori pentru a va familiariza cu vim:


Pentru a intra in program rulati comanda vim




Sunteti in modul Normal, nu puteti edita nimic


Tastati i pentru a ajunge in modul Insert. In acest mod se poate scrie
text.
Introduceti textul:

Azi invat sa folosesc Vim.

Cand ati terminat de introdus text, parasiti modul Insert prin tasta ESC.
Sunteti iar in modul Normal.
Salvati fisierul: :w tutorial. In momentul in care tastati : cursorul se




muta pe ultima linie, sunteti in modul Comanda.


Lansati comanda cu Enter, ati revenit in modul Normal.
Parasiti vim dand comanda :q.

 Lansati vim in executie pentru a edita fisierul tutorial: vim tutorial


 Introduceti o linie noua sub prima: tastati o (open line) pentru a crea o


noua linie si a va pozitiona la inceputul ei.


Introduceti textul:

1236547890


Salvati si iesiti dintr-o singura comanda: :wq

Editati fisierul: vim tutorial

In modul normal, puteti naviga folosind tastele hjkl. Fiind pe homerow folosirea acestora e mai rapida decat folosirea tastelor sageti.

15

Folositi hjkl pentru a ajunge pe pozitia caracterului 0.

Adaugati o linie noua pentru text (o) continand numele vostru.




Salvati fara a iesi.


Pentru a ajunge rapid la prima linie, folositi gg

Navigati pana la finalul cuvantului sa. Folositi w pentru a sari cate un




cuvant.
Adaugati nu astfel incat linia sa fie Azi invat sa nu folosesc Vim.
Iesiti din vim fara a salva. Folositi ! pentru a va rasti la el daca se




plange de ceva.
Reintrati in fisier.
Vom copia prima linie de 10 ori la finalul fisierului. Tastati Y (yank line
y mare) sau y$ (yank until end of line). Majoritatea actiunilor din modul

Normal care au nevoie de un domeniu de existenta (ce sa copiez, ce sa


sterg, etc.) sunt formate din 2 parti: una pentru specificarea actiunii (y
in cazul nostru) si una pentru specificarea domeniului (reprezentand o
deplasare a cursorului - $ va muta la finalul randului, ^ va muta la
inceputul lui)
Pentru a ajunge rapid la ultima linie, folositi G

Pentru a lipi linia copiata folositi P.

Nu a lipit unde trebuie (P = lipeste inainte). Folositi u (undo) pentru a

reveni la situatia anterioara.


Lipiti unde trebuie cu p.

Pentru a lipi celelalte 9 linii vom folosi un prefix numeric: 9p

Vrem sa stergem doua linii. Tastati V (visual line) si folositi j pentru a

selecta si linia urmatoare.


Putem selecta text doar in modul Vizual (in care intram cu v - V
permite selectarea de linii intregi)
tastati d pentru a sterge selectia






Navigati la ultima linie din fisier si tastati p


Salvati.
Navigati pe linia cu numarul din fisier (linia 2)
Observam ca cifrele nu sunt in ordine crescatoare. Tastati f6 pentru a

fi pozitionati pe primul 6.
Tasta x (x mic, nu x mare) sterge caracterul de sub cursor. In

combinatie cu p, folositi-o pentru a interschimba cifrele intre el pana ce


numerele vor fi crescatoare.
Stergeti intreaga linie cu dd

Salvati si iesiti. Acum cunoasteti o buna parte din vim.

16

17

S-ar putea să vă placă și