Differences

This shows you the differences between two versions of the page.

Link to this comparison view

info1:laboratoare:07 [2020/12/15 13:56]
alexandru.vochescu [Expresii regulate & grep]
info1:laboratoare:07 [2021/01/19 13:02] (current)
alexandru.vochescu
Line 1: Line 1:
-===== Laboratorul ​08Globbing (recapitulare) și Expresii regulate ​===== +===== Laboratorul ​07Vimtutor ​=====
- +
-===== Selectarea multiplor fișiere folosind globbing (recapitulare) ===== +
- +
-Întotdeauna când deschidem un terminal o facem pentru că vrem să realizăm o sarcină: vrem să redenumim rapid ultimele poze făcute cu telefonul de la genericul **DCIM1001** la ceva util **Excursie Sinaia, Ian 2020, 1001**, vrem să ne testăm proiectul și să urcăm modificările pe GitHub, etc. +
- +
-Până acum am aplicat diferite comenzi fie pe fișiere individuale,​ fie pe întreg directorul. Foarte des vom avea nevoie de un mijloc prin care să putem selecta un număr variabil de fișiere care au un nume care corespunde unui tipar (//​pattern//​) comun. +
- +
-Să revenim la scenariul prezentat anterior: vrem să selectăm pozele din excursia din Sinaia. În directorul în care avem pozele din excursie avem și alte poze de la alte evenimente. Știm că pozele din excursie încep toate cu numele **DCIM** și apoi sunt urmate de un număr. Ceea ce vrem să facem este să selectăm toate pozele al căror nume corespunde acestui tipar și să le mutăm într-un director separat. Pentru a face acest lucru, folosim **globbing**,​ ca în exemplul de mai jos: +
- +
-<code bash> +
-student@uso:​~/​Pictures$ mv DCIM* excursie-Sinaia-2020/​ +
-</​code>​ +
-Observăm argumentul pe care l-am dat comenzii ''​%%mv%%'',​ și anume ''​%%DCIM*%%''​. Expresia ''​%%DCIM*%%''​ este un exemplu de globbing: adică o expresie care descrie un tipar prin folosirea unor caractere speciale, așa cum este caracterul ''​%%*%%''​. În cazul de față, expresia ''​%%DCIM*%%''​ înseamnă orice fișier al cărui nume începe cu șirul de caractere ''​%%DCIM%%''​. +
- +
-==== Caracterul special * ==== +
- +
-În sintaxa globbing, caracterul ''​%%*%%''​ poate fi înlocuit cu orice caracter de oricâte ori, sau poate lipsi cu totul. În directorul nostru home (''​%%~%%''​),​ executăm următoarele comenzi: +
- +
-<code bash> +
-student@uso:​~$ ls +
-Desktop ​   Downloads ​ Pictures ​ Templates ​ examples.desktop ​ vm-actions-log.txt +
-Documents ​ Music      Public ​   Videos ​    ​uso.git ​          ​workspace +
- +
-student@uso:​~$ ls -d D* +
-Desktop ​ Documents ​ Downloads +
- +
-student@uso:​~$ ls -d Music* +
-Music +
-</​code>​ +
-Observăm că în expresia ''​%%D*%%'',​ caracterul ''​%%*%%''​ înglobează toate caracterele care urmează literei **D**: "​esktop",​ "​ocuments"​ și "​ownloads"​. Observăm că în cazul expresie ''​%%Music*%%'',​ ''​%%*%%''​ nu ține locul nici unui caracter. +
- +
-==== Caracterul special ? ==== +
- +
-În sintaxa globbing, caracterul ''​%%?​%%''​ înlocuiește exact un caracter, oricare ar fi acela. În directorul nostru home (''​%%~%%''​),​ executăm următoarele comenzi: +
- +
-<code bash> +
-student@uso:​~$ ls -d Musi? +
-Music +
- +
-student@uso:​~$ ls -d Mus?? +
-Music +
- +
-student@uso:​~$ ls -d Music? +
-ls: cannot access '​Music?':​ No such file or directory +
-</​code>​ +
-Observăm că expresiile ''​%%Musi?​%%''​ și ''​%%Mus??​%%''​ s-au înlocuit cu succes cu numele directorului ''​%%Music%%'',​ dar expresia ''​%%Music?​%%''​ a generat o eroare deoarece nu există nici un fișier **Music** urmat de un caracter. +
- +
-==== Sintaxa specială [] ==== +
- +
-În sintaxa globbing, folosim sintaxa ''​%%[]%%''​ pentru a defini o listă de caractere care pot fi folosite în înlocuire. Această sintaxă înlocuiește exact un caracter din lista oferită. În directorul nostru home (''​%%~%%''​),​ executăm următoarele comenzi: +
- +
-<code bash> +
-student@uso:​~$ ls -d Mus[ijk]c +
-Music +
- +
-student@uso:​~$ ls -d Mus[abc]c +
-ls: cannot access '​Mus[abc]c':​ No such file or directory +
-</​code>​ +
-În expresia ''​%%Musi[ijk]c%%'',​ i-am "​spus"​ shellului că al patrulea caracter poate să fie oricare din lista ''​%%[ijk]%%''​. În acest context, globbing a găsit cu succes numele fișierului **Music**. În expresia ''​%%Musi[abc]c%%'',​ i-am "​spus"​ shellului că al patrulea caracter poate să fie oricare din lista ''​%%[abc]%%''​. Deoarece nu avem niciun fișier numit **Musac**, **Musbc** sau **Muscc**, comanda ne-a afișat mesajul de eroare corespunzător. +
- +
-Sintaxa ''​%%[]%%''​ nu ne limitează la a oferi enumarații de caractere, așa cum am făcut cu ''​%%[ijk]%%''​ sau ''​%%[abc]%%''​. Sintaxa accepta și intervale, cum observăm în exemplul de mai jos: +
- +
-<code bash> +
-student@uso:​~$ ls -d Mus[A-Za-z0-9]c +
-Music +
-</​code>​ +
-Citim expresia ''​%%[A-Za-z0-9]%%''​ în următorul mod: această expresie înlocuiește un caracter din intervalul ''​%%A-Z%%''​ sau din intervalul ''​%%a-z%%''​ sau din intervalul ''​%%0-9%%'';​ cu alte cuvinte înlocuiește un caracter //​alfa-numeric//​((Folosim forma ''​%%A-Za-z%%''​ pentru a preciza orice caracter din alfabetul englez, indiferent dacă este majusculă sau nu. Nu putem folosi forma ''​%%A-z%%''​ datorită reprezentării caracterelor în tabelul ASCII. Caracterele **A-Z** sunt reprezentate în intervalul **65-90**, iar caracterele **a-z** în intervalul **97-122** în tabelul ascii. Dacă am folosi forma **A-z**, i-am indica expresiei globbing să includă și caracterele din intervalul **91-96** din tabelul ascii în expresia noastră. +
-)). +
- +
-Tip +
- +
- +
-Folosind sintaxa ''​%%[]%%''​ putem rescrie mutarea pozelor a.î. să o facem mai precisă: +
- +
-<code bash> +
-student@uso:​~/​Pictures$ mv DCIM[0-9][0-9][0-9][0-9].jpg excursie-Sinaia-2020/​ +
-</​code>​ +
-Cu expresia de mai sus vom muta toate pozele din intervalul **DCIM0000** - **DCIM9999**. +
- +
- +
-==== Sintaxa specială {} ==== +
- +
-În sintaxa globbing, folosim sintaxa ''​%%{}%%''​ pentru a defini o listă de cuvinte (grupuri de caractere) care pot fi folosite în înlocuire. Această sintaxă înlocuiește exact un cuvânt din lista oferită. În directorul vostru home (''​%%~%%''​),​ executați următoarele comenzi: +
- +
-<code bash> +
-student@uso:​~$ ls -d {Downloads,​Music} +
-Downloads ​ Music +
- +
-student@uso:​~$ ls -d {Down,​Mus}* +
-Downloads ​ Music +
-</​code>​ +
-Citim expresia ''​%%{Downloads,​Music}%%'':​ în locul acestei expresii poate să existe cuvântul **Downloads** sau cuvântul **Music**. Observăm că putem să combinăm orice elemente de globbing, așa cum am făcut în expresia ''​%%{Down,​Mus}*%%''​. +
- +
-==== Folosirea ad-litteram a caracterelor speciale ==== +
- +
-Există cazuri când numele fișierelor conțin caractere speciale. Unele fișiere pot fi prefixate cu o categorie din care fac parte, ca în exemplul de mai jos: +
- +
-<code bash> +
-student@uso:​~$ ls Documents/​uni +
-'[PC] Course 01.pdf' ​ '[USO] Course 01.pdf' ​ '[USO] Course 02.pdf'​ +
-</​code>​ +
-În exemplul de mai sus, fișierele pdf de curs sunt prefixate cu numele materiei: [PC], [USO]. Vrem să îi spunem sintaxei de globbing că în acest caz, șirul **[USO]** nu trebuie tratat ca o expresie, ci ca un șir de caracter normale. Pentru a face acest lucru, încadrăm șirul între **"​**:​ +
- +
-<code bash> +
-student@uso:​~$ ls Documents/​uni/"​[USO]"​* +
-'​Documents/​uni/​[USO] Course 01.pdf' ​ '​Documents/​uni/​[USO] Course 02.pdf'​ +
-</​code>​ +
-Citim expresia ''​%%"​[USO]"​*%%'':​ orice fișier al cărui nume începe cu șirul de caractere **[USO]** și este urmat de orice caracter. Operația prin care eliminăm semnificația specială a unui caracter poartă numele de **escaping**;​ cu alte cuvinte, informal, spunem că am făcut escaping semnificației speciale a sintaxei ''​%%[]%%''​. Termenul vine de la cuvântul **escape** (a scăpa), și exprimă că scăpăm de semnificația specială a unui caracter / set de caractere. +
- +
-==== Exerciții ==== +
- +
-Pentru exercițiile următoare vom folosi fișierele din directorul de suport ''​%%~/​uso-lab/​labs/​05-cli/​support/​support-globbing%%''​. +
- +
-  - Creați un director numit ''​%%pdfs%%''​. Mutați toate fișierele cu extensia ''​%%.pdf%%''​ din directorul ''​%%~/​uso-lab/​labs/​05-cli/​support/​support-globbing%%''​ în directorul ''​%%pdfs%%''​. +
-  - Creați un director numit ''​%%Excursie Brasov, 2020-2021%%''​. Mutați fișierele **DCIM** din intervalul 1400 - 1700 în directorul creat. +
-  - Creați un director numit ''​%%cursuri/​anul-I%%''​. Mutați toate fișierele care conțin cuvintele **curs** sau **slide** în directorul creat. Folosiți sintaxa ''​%%*{curs,​slide}*%%''​. +
- +
-===== Expresii regulate ===== +
- +
-Expresiile regulate sunt folosite pentru căutarea/​selecția anumitor intrări în fișiere text și pentru parsarea informațiilor din fișiere text. În procesarea expresiilor regulate, matching-ul se face pe fiecare linie din text. Într-o expresie regulată, anumite caractere au rol special precum caracterele de mai jos. +
- +
-^ Caracter ^ Efect în expresie regulată ^ +
-| ''​%%^%%''​ | început de linie | +
-| ''​%%$%%''​ | sfârșit de linie | +
-| ''​%%.%%''​ | orice caracter | +
-| ''​%%*%%''​ | expresia anterioară de oricâte ori, posibil niciodată | +
-| ''​%%+%%''​ | expresia anterioară de oricâte ori, cel puțin o dată | +
-| ''​%%[ajt]%%''​ | orice caracter din setul de caractere ''​a'',​ ''​j'',​ ''​t''​ | +
-| ''​%%[^ajt]%%''​ | orice caracter **mai puțin** caracterele ''​a'',​ ''​j'',​ ''​t''​ | +
-| ''​%%|%%''​ | expresia anterioară **sau** expresia de după (una dintre cele două expresii) | +
-| ''​%%?​%%''​ | expresia anterioară o dată sau niciodată | +
- +
-<note tip> +
-Găsiți un tool online [[http://​regexr.com/​|aici]] care va permite să vizualizați efectul expresiilor regulate în mod interactiv. Puteți să îl folosiți pentru a vă obișnui cu scrierea de regexp-uri.  +
-</​note>​ +
- +
-==== Expresii regulate vs globbing ==== +
- +
-|  Construcție ​ |  RegExp ​ |  Glob  | +
-|  ''​%%.%%''​ | orice caracter ​ |  caracterul ''​.'' ​ |  +
-|  ''​%%.*%%''​ |  orice caracter de oricâte ori, posibil niciodată ​ |  orice incepe cu ''​.'' ​ | +
-|  ''​%%?​%%''​ |  expresia anterioară o dată sau niciodată ​ |  orice caracter ​ | +
-|  ''​%%a+%%''​ |  caracterul ''​a''​ de oricâte ori, cel puțin o dată  |  caracterul ''​a''​ urmat de ''​+'' ​ | +
- +
-==== Expresii regulate & grep ==== +
- +
-În directorul din repository aferent laboratorului există un fișier ''​students.txt''​ pe care îl vom folosi ca suport pentru comenzi cu expresii regulate. Acest fișier conține o listă de studenți cu numele complet al studenților (prima coloană), grupa din care fac parte (a doua coloană) și diverse note la USO (nota finală - a treia coloană, nota la testul grilă - a patra coloană - și nota la testul practic - a cincea coloană), câmpuri separate prin caracterul tab. +
- +
-Pentru căutarea și selectarea de linii din fișiere text folosim comanda ''​grep''​ care folosește, la rândul ei, expresii regulate. Astfel, dacă dorim să selectăm studenții care au litera ''​z''​ în numele lor, folosim comanda +
-<code bash> +
-student@uso:​~/​uso-lab/​labs/​06-scripting/​support/​basics/​00-basics$ grep '​z'​ students.txt  +
-GHECENCO F. Răzvan 312CC 8 8.75 4.67 +
-MARIN N. Răzvan 312CC 5 3.5 4.2 +
-</​code>​ +
- +
-<note important>​ +
-Este recomandat ca argumentul de tip expresie regulată transmis comenzii ''​grep''​ să fie plasat între apostrofuri (''​%%'​%%''​) pentru a fi escapat. În felul acesta caracterele din expresia regulată vor fi transmise întocmai comenzii ''​grep''​ și nu vor fi interpretate de shell. +
-</​note>​ +
- +
-<spoiler Click pentru detalii legate de apostrofuri și ghilimele>​ +
-În shell este recomandată folosirea ghilimelelor (''"'',​ //(double) quotes//) și a apostrofurilor (''​%%'​%%'',​ //single quotes//) pentru escapare. **Escapare** înseamnă că nu vor fi interpretate special caracterele speciale din shell; adică vor fi interpretate drept caractere obișnuite. Exemple de caractere speciale în shell sunt: +
-  * ''​$'':​ folosit pentru expandare: expandarea valorii unei variabile, expandarea unei comenzi, substituție aritmetică +
-  * ''​*'':​ folosit în globbing: înseamnă orice caracter de oricâte ori +
-  * ''>'',​ ''<'':​ folosite pentru redirectare +
-  * ''&'',​ ''​|'':​ folosite pentru trimiterea unei comenzi în background sau pentru înlănțuirea unei comenzi; sau ca parte a operatorilor de secvențiere condiționată (''​||''​ și ''&&''​) +
-  * '';'':​ folosit pentru secvențierea comenzilor +
-  * ''​('',​ ''​)'':​ folosite pentru crearea de subshell-uri +
-  * ''"'',​ ''​%%'​%%'',​ ''​\'':​ folosite pentru escapare +
- +
-Diferența dintre ghilimele și apostrofuri constă în interpretarea caracterului dolar (''​$'',​ //​dollar//​). Între ghilimele, caracterul dolar își păstrează rolul special, pe când între apostrofuri este considerat un caracter ca oricare altul. +
- +
-De exemplu, dacă dorim să afișăm valoarea variabilei ''​USER'',​ vom folosi construcția +
-<code bash> +
-student@uso.local:​~$ echo "​$USER"​ +
-student +
-</​code>​ +
-Va fi afișată valoarea variabilei ''​USER''​ întrucât am folosit construcția ''​$USER''​ între ghilimele. +
- +
-Dacă însă folosim construcția ''​$USER''​ între apostrofuri,​ ca în continuare +
-<code bash> +
-student@uso.local:​~$ echo '​$USER'​ +
-$USER +
-</​code>​ +
-atunci va fi afișat chiar șirul ''​$USER''​. Asta pentru că apostrofurile,​ spre deosebire de ghilimele, escapează inclusiv caracterul dolar. +
-</​spoiler>​ +
- +
-Doar că expresia ''​z''​ nu se potrivește (nu face //match//) pe litera ''​Z''​ (majusculă). Pentru a selecta studenții al cărore nume conține atât litera ''​z''​ cât și ''​Z''​ (majusculă) folosim expresia regulată ''​%%[zZ]%%''​ și comanda +
-<code bash> +
-student@uso:​~/​uso-lab/​labs/​06-scripting/​support/​basics/​00-basics$ grep '​[zZ]'​ students.txt  +
-PAJARCU Z.P. Raul-Constantin 312CC 2 0.5 1.7 +
-GHECENCO F. Răzvan 312CC 8 8.75 4.67 +
-MARIN N. Răzvan 312CC 5 3.5 4.2 +
-ZINCULESCU C. Marius-Valentin 313CC 7 4.75 5.7 +
-</​code>​ +
-Expresia regulată ''​%%[zZ]%%''​ se potrivește pe setul de caractere compus din litera ''​z''​ cât și ''​Z''​ (majusculă). Cu aceasta au apărut două linii noi: o linie conține studentul cu numele de familie ''​ZINCULESCU''​ iar cealaltă linie conține ințialele ''​Z.P.''​ ambele cu litera ''​Z''​ (majusculă). +
- +
-Dacă vrem să selectăm studenții al căror nume de familie începe cu litera ''​F'',​ atunci vom folosi expresia regulată ''​%%^F%%''​ denotând litera ''​F''​ (majusculă) la început de rând. Vom folosi, așadar, comanda de mai jos: +
-<code bash> +
-student@uso:​~/​uso-lab/​labs/​06-scripting/​support/​basics/​00-basics$ grep '​^F'​ students.txt  +
-FLOREA N. Monica-Andreea 313CC 9 7.5 8.5 +
-FULGER P. Alexandru-Gabriel 315CC 7 4.25 5 +
-</​code>​ +
- +
-Dacă vrem în schimb să selectăm studenții al căror prenume începe cu litera ''​F''​ trebuie să privim lucrurile altfel. Urmărind textul putem observa că prenumele sunt precedate fie de caracterul spațiu (//blank//) fie de caracterul minus (''​-''​). Pentru început vom folosi expresia regulată ''​%%[ -]F%%''​ care face match pe caracterul spațiu sau minus urmat de caracterul ''​F''​ majusculă. Comanda aferentă este: +
-<code bash> +
-student@uso:​~/​uso-lab/​labs/​06-scripting/​support/​basics/​00-basics$ grep '[ -]F' students.txt  +
-ONEA I. Flavia-Katilina 311CC 7 6.5 4.33 +
-PLEȘEA Fl. Alexandru 311CC 9 9.25 7.9 +
-GHECENCO F. Răzvan 312CC 8 8.75 4.67 +
-EPURE P. Andi-Florin 314CC 8 9.5 3.67 +
-NEACȘU C. Florin-Mărgărit 314CC 10 9 9 +
-COSTEA I. Florin Traian 315CC 4 3.5 3.7 +
-CHIȚESCU E. Bogdan-Florentin 315CC 9 7.75 6.89 +
-</​code>​ +
-Observăm, însă, că se face match și pe șirul ''​Fl.''​ și pe șirul ''​F.''​ reprezentând inițiale. Știm că un prenume conține doar litere mici și că **nu** se încheie cu punct (''​.'',​ //dot//). Atunci extindem expresia regulată de mai sus la expresia ''​%%[ -]F[a-z]\+[^\.]%%''​. Expresia regulată face match pe un șir care: +
-  * începe cu unul dintre caracterele spațiu (//blank//) sau minus (''​-''​);​ +
-  * continuă cu litera ''​F''​ (majusculă) +
-  * continuă cu litere mici (folosind setul ''​%%[a-z]%%''​) +
-  * literele mici de oricâte ori cel puțin o dată (folosind caracterul plus (''​+''​)) +
-  * continuă cu orice caracter diferit de punct (''​.'',​ //dot//), folosind expresia ''​%%[^\.]%%''​. Folosim backslash (''​\''​) pentru a escapa caracterul punct (''​.'',​ //dot//); altfel ar fi însemnat orice caracter, așa cum înseamnă într-o expresie regulată. +
- +
-<​note>​ +
-În expresiile regulate obișnuite (//basic regular expressions//​),​ anumite caractere își pierd rolul lor special. Este cazul caracterului ''​+'',​ dar și al caracterelor ''?'',​ ''​%%{%%'',​ ''​('',​ ''​)''​ și ''​|''​. Pentru a-și păstra rolul special, acestea trebuie precedate de backslash în construcții de forma ''​\+'',​ ''​\?'',​ ''​%%\{%%'',​ ''​\('',​ ''​\)''​ și ''​\|''​. +
- +
-Găsiți această precizare în pagina de manual a comenzii ''​grep'';​ căutați șirul ''​Basic vs Extended''​. +
-</​note>​ +
- +
- +
-Astfel, comanda ''​grep''​ pentru a extrage studenții al căror prenume începe cu litera ''​F''​ este +
-<code bash> +
-student@uso:​~/​uso-lab/​labs/​06-scripting/​support/​basics/​00-basics$ grep '[ -]F[a-z]\+[^\.]'​ students.txt  +
-ONEA I. Flavia-Katilina 311CC 7 6.5 4.33 +
-EPURE P. Andi-Florin 314CC 8 9.5 3.67 +
-NEACȘU C. Florin-Mărgărit 314CC 10 9 9 +
-COSTEA I. Florin Traian 315CC 4 3.5 3.7 +
-CHIȚESCU E. Bogdan-Florentin 315CC 9 7.75 6.89 +
-</​code>​ +
- +
-<note tip> +
-Dacă ați fi dorit să faceți match pe o literă (mică sau mare) ați fi folosit construcția ''​[a-zA-Z]''​. Dacă ați fi dorit să faceți match pe o literă (mică sau mare) sau pe o cifră, ați fi folosit expresia ''​[a-zA-Z0-9]''​. +
-</​note>​ +
- +
-==== Exerciții ==== +
- +
-Accesați subdirectorul ''​~/​uso-lab/​labs/​06-scripting/​support/​04-regex/''​. Vrem să folosim expresii regulate pentru a prelucra fișierele ''​students.csv''​ și ''​students.txt''​. +
- +
-**Exerciții**:​ Folosiți ''​grep''​ pentru a extrage, respectiv, din fișierul ''​students.csv'':​ +
-  * studenții de la grupa ''​315CC''​ +
-  * studenții de la grupa ''​315CC''​ și care au luat prima notă ''​9''​ (din cele 3 coloane) +
-  * studenții de la grupa ''​315CC''​ și care au luat a doua notă care începe cu cifra ''​7''​ (din cele 3 coloane) +
-  * studenții de la grupa ''​315CC''​ și care au luat a treia notă care începe cu cifra ''​6''​ (din cele 3 coloane) +
- +
-Mai jos sunt rezultatele așteptate pentru cele patru comenzi de mai sus: +
-<​code>​ +
-$ grep TODO students.csv  +
-ȚIFREA C. Alexandru-Nicolae,​315CC,​7,​7,​6.25 +
-BOGDAN O.Gh. Ana,​315CC,​5,​4.5,​1.89 +
-COSTEA I. Florin Traian,​315CC,​4,​3.5,​3.7 +
-OLTEANU Ș. Ionuț-Mihăiță,​315CC,​7,​4.25,​4.7 +
-FULGER P. Alexandru-Gabriel,​315CC,​7,​4.25,​5 +
-DUȘE-VASILIU V. Andra,​315CC,​8,​7,​6.4 +
-CHIȚESCU E. Bogdan-Florentin,​315CC,​9,​7.75,​6.89 +
-MAVRODIN I. Andrei,​315CC,​9,​7,​6.4 +
-DRĂGOI M. Ovidiu-Alexandru,​315CC,​8,​8,​3.44 +
-MANEA A. Mihail-Alin,​315CC,​7,​6.75,​6.22 +
-TRACHE M. Ana-Maria,​315CC,​7,​4.75,​4.9 +
-IORDACHE M. Tiberiu-Constantin,​315CC,​8,​8.25,​4.56 +
-BARBU I. Ștefan,​315CC,​10,​10,​7.56 +
-MĂNOIU I. Ioana-Veronica,​315CC,​10,​10,​8.6 +
-STOICA I.D. Aurel-Octavian,​315CC,​7,​3.75,​5.4 +
-IUȘAN V. Bogdan-Cosmin,​315CC,​9,​7.25,​8 +
-BURCEANU D.N. Radu-Gabriel,​315CC,​8,​8.75,​7 +
-ASĂVOAEI P. Cătălin,​315CC,​8,​6.75,​7 +
-ȘTIRBĂȚ A. Steliana,​315CC,​10,​10,​10 +
- +
-$ grep TODO students.csv  +
-CHIȚESCU E. Bogdan-Florentin,​315CC,​9,​7.75,​6.89 +
-MAVRODIN I. Andrei,​315CC,​9,​7,​6.4 +
-IUȘAN V. Bogdan-Cosmin,​315CC,​9,​7.25,​8 +
- +
-$ grep TODO students.csv  +
-ȚIFREA C. Alexandru-Nicolae,​315CC,​7,​7,​6.25 +
-DUȘE-VASILIU V. Andra,​315CC,​8,​7,​6.4 +
-CHIȚESCU E. Bogdan-Florentin,​315CC,​9,​7.75,​6.89 +
-MAVRODIN I. Andrei,​315CC,​9,​7,​6.4 +
-IUȘAN V. Bogdan-Cosmin,​315CC,​9,​7.25,​8 +
- +
-$ grep TODO students.csv  +
-ȚIFREA C. Alexandru-Nicolae,​315CC,​7,​7,​6.25 +
-DUȘE-VASILIU V. Andra,​315CC,​8,​7,​6.4 +
-CHIȚESCU E. Bogdan-Florentin,​315CC,​9,​7.75,​6.89 +
-MAVRODIN I. Andrei,​315CC,​9,​7,​6.4 +
-MANEA A. Mihail-Alin,​315CC,​7,​6.75,​6.22 +
- +
-</​code>​ +
  
 +Comanda vimtutor
info1/laboratoare/07.1608033375.txt.gz · Last modified: 2020/12/15 13:56 by alexandru.vochescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0