Lucrarea 2

Comenzi Unix uzuale. Expresii regulate. Editoare de texte


 
 1. Scopul lucrării
  Lucrarea de faţă prezintă, în ordine alfabetică, cele mai uzuale comenzi Unix. Lucrarea prezintă expresiile regulate şi comenzile editorului de texte ed şi vi.
 
2. Consideraţii teoretice

2.1. Comenzi Unix uzuale

at Execută un fişier de comenzi la un moment de timp precizat.
Sintaxa: at timp [data] [fişier]
  Timpul se specifică prin 2 sau 4 cifre. Dacă se specifică prin 2 cifre acestea au semnificaţie de ore, iar în celălalt caz se specifică ora urmată de minute. Dacă lipseşte data, atunci timp se referă la ziua curentă. Numele fişierului de comenzi este fişier (dacă acesta lipseşte comenzile vor fi preluate de la terminal).
Exemplu: at 0815am Jan 24 lucrări
  La 24 ian, ora 8:15 se va lansa în execuţie fişierul de comenzi lucrări.
cat Concatenează şi afişează conţinutul fişierelor.
Sintaxa: cat [opţiuni] fişiere
Opţiuni:
  -s Nu afişează mesaje de inexistenţă fişier.
  -v Tipăreşte caracterele de control (^caracter).
  -w Operaţiile de ieşire se fac fără tampon.
Exemplu: cat f1 f2 f3 concatenează fişierele f1,f2,f3 şi afişează la terminal rezultatul.
cc Compilatorul programelor C ( C Compiler).
Sintaxa: cc [opţiuni] fişier(e).[c|s|o]
  Comanda lansează în execuţie compilatorul limbajului C primind ca intrare textul sursă în unul sau mai multe fişiere sursă C (cu extensia .c), în asamblare (.s) sau obiect (.o). Compilatorul C este cu două treceri. Prima trecere produce un cod intermediar C pe baza textului sursă. Acest cod este translatat în limbaj de asamblare de trecerea a doua a compilatorului. Codul intermediar este independent de maşina pe care este instalat sistemul, în timp ce limbajul de asamblare, asamblorul şi loaderul depind de hardware.
Opţiuni:
  -c Compilare simplă (fără a genera cod executabil), produce fişierele obiect corespunzătoare fişierelor ce urmează opşiunii.
  -o f Generează fişierul executabil f. Dacă această opţiune lipseşte, programul executabil va purta numele a.out.
  -f Compilarea cu opţiunea de virgula mobilă.
  -lm Legarea bibliotecii matematice.
cd Schimbă directorul curent.
chmod Prezentată în lucrarea anterioară.
cmp Compară două fişiere.
Sintaxa: cmp [opţiuni] fişier1 fişier2
Opţiuni:
  -l Afişează numărul şi valoarea în octal pentru fiecare diferenşă întâlnită.
  -s Rezultatul comparării este dat printr-un cod (0=identice, 1=diferite, 2=eroare).
cp Copiază un fişier în altul sau fişiere într-un director.
Sintaxa: cp fişier1 fişier2
cp fişiere director
echo Afişează argumentele sale la terminal. Comanda se utilizează în special în fişiere de comenzi pentru a afişa diferite mesaje.
ls Prezentată în lucrarea anterioară.
mail Trimite un mesaj unui utilizator sau vizualizează conţinutul cutiei poştale a utilizatorului care emite comanda.
Sintaxa: mail utilizator
  Utilizatorul se specifică prin numele său de login.
  Utilizarea comenzii pentru inspectarea cutiei poştale determină afişarea unui mesaj şi a unui prompter. La acest prompter, utilizatorul răspunde cu subcomenzile:
  <CR sau
  + Următorul mesaj.
  - Afişează precedentul mesaj.
  d Şterge mesajul curent şi afişează următorul.
  p Reafişează mesajul curent.
  s f Salvează mesajul în fişierul specificat.
  q Quit mail cu păstrarea mesajelor neşterse.
  x Exit mail şi păstrează nemodificată cutia poştală.
  !cmd Execută comanda Unix cmd.
Exemplu: $mail user1
  Mai faceţi modificări în proiect? Aştept răspuns !
  $ man Afişează conşinutul manualului programatorului Unix, legat de un anumit subiect.
Sintaxa: man subiect
Exemplu: man ls Afişează informaşii despre comanda ls.
mesg Stabileşte modul de tratare al mesajelor.
Sintaxa: mesg [opţiuni]
Opţiuni:
  -y Permite recepţia şi afişarea mesajelor.
  -n Invalidează recepţionarea mesajelor.
make Utilitarul make a fost conceput în scopul automatizării părţii de rutină a activităţii de întreţinere a programelor. Ideea de bază este memorarea într-un fişier cu o structura particulară, numit implicit makefile, a interdependenţei programelor şi a secvenţelor de comenzi necesare pentru obţinerea programului executabil din textele sursă ale componentelor de bază.
Sintaxa:
make [opţiuni][-f makefile][macrodef...][fişiere_ţintă]
Opţiuni:
  -n Se afişează liniile de comandă, dar nu se execută.
  -t Actualizarea fişierelor ţintă.
  -p Afişare macrodefiniţii.
  -f Precede numele unui fişier de descriere (tip makefile).
Exemplu: Programul prg este generat prin compilarea şi legarea modulelor sursă x.c, y.c şi z.c folosind biblioteca ls. Modulele obiect se vor numi respectiv x.o, y.o şi z.o. Se consideră că modulele x.c şi y.c includ fişierul def.h. Interdependenţa între module este descrisă prin:
  prg: x.o y.o z.o
  cc x.o y.o z.o -ls -o prg
  x.o y.o: def.h
  Dacă acest fişier este denumit makefile, la fiecare lansare a comenzii make se va obţine o variantă reactualizată a programului prg pe baza ultimelor versiuni din surse. Dacă nu există variante mai noi ale fişierelor componente în raport cu ultima compilare a lui prg nu se va face nici o compilare. Dacă însă între timp s-ar fi modificat def.h, s-ar fi recompilat x.c si y.c (nu si z.c). Dacă în linia de comandă make nu se specifică nici un fişier, atunci primul fişier menţionat în lista de descrieri este automat recompilat. Dacă însă, folosind fişierul makefile de mai sus, am scrie: make x.o ar avea loc recompilarea lui x.c condiţionată de modificarea între timp a lui x.c sau def.h. O facilitate utilă este folosirea macrodefiniţiilor. În acest caz numele unei macro-definiţii începe cu semnul $ urmat de unul sau mai multe caractere între paranteze. Pentru exemplul de mai sus:
  OB = x.o y.o z.o
  BIBL = -ls
  prg: $(OB)
  cc $(OB) $(BIBL) -o prg
  În interiorul fişierelor de descriere (makefile) se pot introduce comentarii precedate de caracterul '#'.
mkdir Creează un director. Intrarile . şi .. sunt create automat. Drepturile de acces sunt cele implicite (0777). Se impune dreptul de a scrie în director pentru a crea directoare.
Sintaxa: mkdir [-m acces][-p] directoare
Opţiuni:
  -m acc Specifică drepturile de acces pentru directorul creat;
  -p Creează toate directoarele neexistente din numele de cale specificat, dacă acestea nu există.
Exemplu:
  mkdir -p usr/adi/prj Creează subdirectoarele indicate;
  mkdir grp1 grp2 grp3 Creează 3 directoare noi;
mv Redenumeşte un fişier sau mută un fişier într-un director.
Exemplu: mv f1 f2 Fişierul f1 este copiat în f2.
  mv f ./d1 Fişierul f este copiat în directorul d1.
pwd Afişează numele complet al directorului curent.
rm Şterge un fişier sau director.
Sintaxa: rm [opţiuni] fişier(e)
Opţiuni:
  -i Cere permisiunea înainte de a şterge fişierul.
  -f Forţează ştergerea, neraportând eventualele erori.
  -r Şterge toate fişierele din director şi directorul.
Exemplu: rm -r project
rmdir Şterge un director dacă acesta este vid.
test Evaluează expresia ce urmează comenzii. Comanda este utilizată frecvent în fişiere de comenzi. Rezultatul evaluării este true sau false. Comenzile de mai jos sunt adevărate:
  test -r f Dacă f există şi are permisiunea read.
  test -w f Dacă f există şi are permisiunea write.
  test -x f Dacă f există şi are permisiunea execute.
  test -d f Dacă f există şi este director.
  test -f f Dacă f există şi este fişier ordinar.
  test -s f Dacă f există şi are dimensiunea 0.
  test -z s1 Dacă lungimea şirului s1 este 0.
  test -n s1 Dacă lungimea şirului s1 nu este 0.
  test s1=s2 Dacă s1 şi s2 sunt identice.
  test s1!=s2 Dacă s1 şi s2 nu sunt identice.
  test s1 Dacă şirul s1 nu este şirul null.
  test n1 -eq n2 Dacă întregii n1 şi n2 sunt egali.
  Alte comparări: -nl, -gt, -gl, -lt, -le.
  Se pot utiliza operatori logici !(negaţie), -a (şi), -o (sau) şi () (paranteze rotunde) pentru a construi expresii compuse din cele de mai sus.
tty Afişează numele complet al terminalului de la care s-a emis comanda.
wc Contorizarea numărului de linii, cuvinte şi caractere dintr-un fişier.
Sintaxa: wc [opţiuni] [fişier]
Opţiuni:
  -l Afişează numărul liniilor din fişier.
  -w Afişează numărul cuvintelor din fişier.
  -c Afişează numărul caracterelor din fişier.
Exemplu: wc studenţi
who Afişează numele utilizatorilor conectaşi în sistem.
write Trimite mesaj unui alt utilizator conectat la sistem;
Sintaxa: write utilizator [terminal]
  Mesajul care se trimite se specifică la fel ca în cazul lui mail.
  Pentru alte comenzi Unix a se vedea bibliografia.
 
2.2. Expresii regulate
  Expresiile regulate au rolul de a specifica mulţimi de şiruri de caractere. Ele stabilesc un şablon pentru potriviri de text. Sunt utilizate în general pentru a identifica dintr-un text anumite şiruri de caractere. Expresiile regulate descrise aici sunt conform specificaţiei editorului ed şi sunt recunoscute de majoritatea programelor utilitare. Editorul vi şi ed permit facilitaţi suplimentare.
  În general orice caracter ce apare într-o expresie regulată identifică un caracter din text. Există însă anumite caractere speciale care permit definirea de şabloane variabile. În expresiile regulate se utilizează două tipuri de caractere:
  • caractere alfanumerice, care desemnează exact caracterele reprezentate;
  • caractere speciale sau operator care desemnează repetiţii, alegeri, opţiuni, etc.
Caractere speciale:
  \ Caracter de protejare - anulează semnificaţia specială a caracterului care îl urmează.
  . Caracter arbitrar (orice caracter).
  * + Operatori de repetiţie:
  a* orice număr de caractere a, chiar 0;
  a+ orice număr de caractere a, cel puţin unul.
  $ La sfâşitul unei expresii regulate marchează un sfârşit de linie.
  ^ La începutul unei expresii regulate marchează început de linie.
  [s] Desemnează o mulţime de caractere. În mulţimea s singurele caractere speciale sunt: -, ] si ^. De exemplu:
  [abc] Unul dintre caracterele a, b sau c.
  [A-Za-z] O litera.
  [][] Unul dintre caracterele ']' sau '['.
  Caracterul '^' complementează o mulţime dacă este la început. De exemplu:
  [^0-9] Caracter nenumeric. O secvenţa de caractere dintr-o expresie regulată se poate delimita prin '\(' şi '\)'. Construcţia este numită expresie regulată marcată. Această expresie poate fi referită apoi prin '\i' cu i între 1 şi 9. De exemplu, expresia:
  \([a-z]*\)\&\1 Selectează şirul 'adi\&adi'.
  Pentru expresii regulate marcate utilitarele awk şi egrep acceptă construcţii de forma:
  \(expr\)* Zero sau mai multe apariţii ale expresiei regulate
  \(expr\)+ Una sau mai multe apariţii ale expresiei regulate.
  \(expr\)? Zero sau o apariţie a expresiei regulate.
  Două expresii regulate separate prin '|' semnifică una dintre ele (alternativa). De exemplu:
  (ab|cd+)?(ef)* Pe prima poziţie apare sau nu ab sau c urmat de cel puţin un d, şi urmat de oricâte grupuri de ef.
  Expresiile regulate între paranteze simple realizează o grupare. De exemplu:
  (a|b)(c|d) Identifica ac, ad, bc sau bd.
  " Toate caracterele situate între " îşi pierd semnificaţia specială.
  / Indică contextul următor. De exemplu:
  ab/cd ab doar dacă este urmat de cd.
  {} Semnifică repetiţii ale unei expresii. De exemplu:
  a\{1,5\} Una până la cinci apariţii ale lui a.
  exp\{6,\} Cel puţin 6 apariţii ale expresiei exp.
  exp\{2\} Exact două apariţii ale expresiei exp.
  [0-9]\{2,\} Secvenţă din două sau mai multe cifre.
  Dacă mai multe caractere speciale apar într-o expresie regulată se aplică regula de precedenţă. Conform acesteea, precedenţa cea mai mare o are [] după care grupul *, + şi ? şi ultimul este |.
  La înlocuirea şirurilor de caractere specificate prin expresii regulate caracterul '&' identifică expresia regulată. Pentru a genera caracterul '&' acesta trebuie prefixat de \.
  Caracterul '\' urmat de <Enter> generează o linie nouă.
 
2.3. Editoare de texte

2.3.1. Comenzile editorului ED (EDitor orientat pe linii)
  Editorul de text ed este un editor la nivel de linie, în sensul că acesta poate opera doar la nivel de linie text. O linie este identificată printr-un număr. Acest editor este foarte simplu, dar pentru o simplă modificare a unui text necesită mai multe comenzi.
  Lucrarea prezintă comenzile editorului ed grupate astfel:
  a) apelul editorului şi revenirea în sistemul de operare;
  b) deplasare în text, vizualizare şi căutare în text;
  c) introducere şi modificare text;
  d) deplasare bloc de text;
  e) alte comenzi.
  Ilustram în cele ce urmează o sesiune de editare folosind editorul ed.
  $ # Semnifică prompterul sistemului Unix. Liniile
  # subliniate trebuie introduse de utilizator.
  $ed fişier # Apel ed cu numele fişierului de editat.
  ?fişier # Răspunsul editorului dacă fişierul e nou. * # Editorul acceptă comenzi editor.
  Notă: comenzile editor sunt formate dintr-o singură literă.
  *a # (Append) Adaugă text după linia curentă.
Aici se va tasta textul fişierului.
Atenţie, o linie terminată ( a fost tastat CR=Enter) nu mai permite modificări la acest nivel.
. # Terminarea introducerii textului.
  *p # (Print) Afişarea liniei curente. Linia curentă
  # fiind ultima introdusă ea este afişată.
nu mai permite modificări la acest nivel.
  *1 # Revenirea pe linia 1.
  */CR/ # Caută şirul "CR" în textul introdus.
s/R/r/p # (Subsitute) Substituie prima apariţie a lui 'R'
  # cu 'r' şi afişează linia modificată.
Atenţie, o linie terminată ( a fost tastat Cr=Enter)
  *+ # Salt la linia următoare.
  *$ # Poziţionare pe ultima linie a fişierului.
  *1,$p # Afişarea conţinutului fişierului.
Aici se va tasta textul fişierului.
  *w # (Write) Salvare conţinut tampon în fişier.
  *w # (Quit) Părăsirea editorului.
  $ # Prompter Unix
  a) Apelul editorului şi revenirea în Unix
  Editorul se apelează prin: ed opţiune fişier
  Dacă fişierul există deja acesta este copiat în tampon şi se răspunde cu numărul de caractere conţinute în fişier. Dacă fişierul nu există editorul răspunde prin ?fişier. Un fişier editat se poate salva pe disc cu w (Write). Dacă se doreşte salvarea unei porţiuni comanda este L1,L2w. Această comandă va salva doar porţiunea cuprinsă între cele două linii. Părăsirea editorului sau revenirea în sistemul de operare se face cu comanda w (Quit).
  b) Deplasarea în text, vizualizare şi căutare
La orice linie se poate ajunge prin numărul ei. Linia curentă este referită prin caracterul . (punct). Prin caracterele + şi Ä se poate face o poziţionare relativă faţa de linia curentă. Caracterul '$' identifică ultima linie a fişierului. Afişarea liniei curente se face cu comanda p (Print) sau prin L1,L2p, dacă se doreşte afişarea unei porţiuni delimitate de două numere de linie. Linia cu numărul L se afişează prin comanda Lp. Pentru căutarea unui şir de caractere într-un fişier se tastează /sir_de_caractere/. Daca şirul specificat este găsit se face pozişionarea pe prima apariţie. Dacă nu se găseşte nici o aparişie editorul răspunde cu caracterul '?'. Căutarea în sens invers se face identic dar se înlocuieşte caracterul / cu ?. Poziţionarea pe apariţia următoare, după o comandă de căutare, se face prin // sau ??.
  c) Introducere şi modificare text
  Introducerea textului într-un fişier se poate face prin comenzile a (Append) sau i (Insert) prin specificarea înaintea comenzii a numărului de linie. Diferenţa între comenzi este locul unde se produce introducerea textului în raport cu linia curentă. Prima comandă introduce textul după linia curentă, iar a doua înaintea ei. Modificarea textului dintr-o linie se face prin comanda s (Substitute) s/text_vechi/text_nou/g care înlocuieşte toate apariţiile (g=Global) text_vechi din linia curentă cu text_nou. Caracterele .,^,$,*,\,[,] au o semnificaţie aparte în cazul modificării. De exemplu:
  1,$s/./,/g Înlocuieşte toate caracterele din fişier cu ','.
  1,$s/\./,/g Înlocuieşte fiecare '.' cu ','.
  ..s/././g Înlocuieşte toate caracterele din linia curentă cu caracterul '.'.
  Un punct pe poziţia text_vechi identifică orice caracter din linia curentă, mai puţin în cazul în care este precedat de caracterul \, caz în care semnifică caracterul punct. Un punct pe poziţia text_nou este caracterul obişnuit. Alte exemple ce reamintesc semnificaţiile caracterelor speciale:
  /^de/ Caută şirul de la început de linie.
  /na$/ Caută şirul na la sfârşit de linie.
  s/x *y/x y/ Substituie toate caracterele dintre x şi y cu un blanc.
  s/^./w/ Înlocuieşte primul caracter din linie cu w;
  1,$s/^[0-9]*// Şterge numerele de la început de linie.
  Rezultatul unei comenzi de substituţie s-ar putea să nu fie cel scontat dacă semnificaţia caracterelor speciale nu este cunoscută. Revenirea liniei la vechiul ei conţinut se poate face prin comanda u (Undo). Ştergerea unei linii sau mai multor linii consecutive se poate face prin d (Delete). Sunt permise formele:
d Şterge linia curenta.
L d Şterge linia L;
L1,L2d Şterge toate liniile dintre L1 şi L2.
  De exemplu:
  .,/123/d Şterge liniile cuprinse între linia curentă şi prima linie ce conţine şirul 123. Înlocuirea unei linii se face prin comanda c (Change).
  d) Deplasarea unui bloc
  Pentru a deplasa un bloc se foloseşte: L1,L2 comanda L3
  Liniile L1, L2 delimitează blocul care se deplasează la linia L3. Numerele de linii pot fi şi rezultatul unor căutări. Comanda poate fi:
m (move) Mută bloc.
t (transfer) Copiază blocul.
  Dacăse doreşte citirea unui întreg fişier şi copierea lui într-o anumită poziţie dintr-un fişier se poate folosi comanda r (Read). De exemplu:
0r fis copiază fis la începutul fişierului din care s-a executat comanda.
  e) Alte comenzi
  Comanda g (Global) aplică o comandă editor întregului fişier. De exemplu: g/buf/s/buf/buff/
  Comanda v (Reverse) neagă acţiunea comenzii. De exemplu:
  v/^[0-9] */d Şterge toate liniile care nu încep cu un număr.
  Comanda ! permite execuţia unei comenzi shell.
  Comanda j (Join) concatenează liniile adresate.
  Comanda k (Mark) atribuie un marcaj (eticheta) liniei adresate. De exemplu comanda: /lac/ka
  Găseşte linia ce conşine cuvântul lac şi o marchează prin litera a. Aceasta linie marcată poate fi adresată prin 'a. Comanda este utilă pentru regăsirea rapidă a unor linii mai importante.

2.3.2. Comenzile editorului ecran VI
  Editorul vi permite vizualizarea conţinutului unui fişier prin deplasarea unei ferestre de-a lungul textului fişierului. Editorul are trei moduri de lucru: modul comandă, modul inserare şi modul ex. Diferenţele între aceste moduri rezultă din analiza comenzilor ce urmează a fi prezentate.
  Apelul editorului se face sub forma:
vi [-r | -R] [+poziţionare] [fişier]
  unde:
  -r Încarcă ultima versiune salvata înainte de căderea sistemului.
  -R Se interzice modificarea conţinutului fişierului.
  Dacă se specifică poziţionare cursorul se poziţionează pe linia specificată (+nr_linie) sau pe şirul căutat (+/sir_căutat).
  Revenirea în sistem se realizează prin comanda ZZ care face salvare pe disc doar dacă au avut loc modificări, sau prin :wq (Write, Quit) care realizează salvarea tamponului de lucru pe disc. Dacă nu se doreşte salvarea se foloseşte :w! (Quit).
  a) Comenzi de deplasare ecran
Ctrl/D Deplasare jos 1/2 ecran.
Ctrl/F Deplasare jos 1 ecran.
Ctrl/U Deplasare sus 1/2 ecran.
Ctrl/B Deplasare sus 1 ecran.
  b) Comenzi de deplasare cursor în ecran
  Dacă tastatura nu conţine tastele de direcţie deplasarea cursorului se poate face prin:
-, H Cursor pe linia dinainte.
k Cursor pe linia dinainte păstrând coloana.
+, L Cursor pe linia următoare.
j Cursor pe linia următoare păstrând coloana.
M Cursor la mijlocul ecranului.
nG Cursor pe linia n.
  <Bksp, h Cursor cu un caracter spre stânga.
  <sp, l Cursor cu un caracter spre dreapta.
$ Cursor la sfârşit de linie.
^ Cursor la început de linie (caracter neblanc).
0 Cursor pe primul caracter din linie.
b, B Cursor pe cuvântul precedent.
w, W Cursor pe cuvântul următor.
e, E Cursor la sfârşitul cuvântului.
  c) Comenzi de ştergere şi înlocuire
x/X Şterge caracterul de sub sau dinaintea cursorului.
dw Şterge cuvântul curent.
dd Şterge linia.
p/P Reface o ştergere anterioară.
cc...Esc Înlocuieşte o linie completă.
R...Esc Înlocuieşte mai multe caractere.
rx Înlocuieşte caracterul de sub cursor cu x.
  d) Comenzi diverse
mx Marchează linia cu x.
/ Căutare înainte( idem ed).
? Căutare înapoi ( idem ed).
u Refacerea stării dinaintea ultimei modificări.
yw Trimite cuvântul curent într-un tampon.
yy Trimite linia curentă într-un tampon intern.
Lyy Trimite linia curentă în tamponul L. De exemplu:
  cyy Trimite linia curentă în tamponul c.
  c10y Trimite 10 linii în tamponul c.
LP Depune conţinutul tamponului L înaintea poziţiei cursorului. Dacă tamponul conţine o linie întreagă ea este inserată înaintea liniei curente.
Lp Depune conţinutul tamponului după poziţia cursorului. Dacă tamponul conţine o linie întreagă ea este inserată după linia curentă.

Comenzile modului inserare
  În modul inserare se intră folosind caracterele i,I,a,A,o,O şi după introducerea textului dorit se revine în editor prin tasta Esc.
i/I...Esc Inserare înaintea cursorului sau la începutul liniei curente.
a/A...Esc Inserare după cursor sau la sfârşitul liniei curente.
o/O...Esc Inserare după sau înaintea liniei curente.

Comenzile modului ex

  Se prefixează comanda cu caracterul :. Comenzile sunt similare editorului ed. La execuţia unei astfel de comenzi ea este afişată pe ultima linie a ecranului curent.
  :nr fis (Read) Plasarea fişierului fis în tamponul de editare pe linia n.
  :w fis (Write) Scrierea conţinutului tamponului de editare în fişierul fis.
  :! cmd Părăsirea temporară a editorului vi şi executarea comenzii specificate.
  La editarea programelor C se poate configura editorul vi folosind comanda set (pentru indentare automată (ai) şi eventual pentru fixarea lungimii tab-ului (ts)). Se pot defini şi macrouri.
  Comenzile editoarelor ed şi vi sunt valide şi în cazul sistemului Linux. Pentru detalii se recomandă man ed sau man elvis, man vi sau man ex.

2.3.3. Alte editoare
  În sistemele Unix există şi editoare mai perfecţionate decât cele prezentate. Un exemplu este emacs. Din motive de spaţiu, având în vedere diversitatea comenzilor sale, comenzile sale nu vor fi prezentate ( a se vedea "Learning GNU Emacs" existentă la biblioteca catedrei).
  În cazul în care se foloseşte o versiune de Linux o alegere comodă este folosirea editorul joe identic din punct de vedere al comenzilor cu editorul ws ( WordStar) de sub sistemul de operare DOS.
  Pe lângă acestea pe sisteme Unix cu interfeţe grafice se pot alege după preferinţe alte editoare.
 
3. Aplicaţii

3.1. Să se scrie secvenţa de comenzi ed pentru a schimba între ele coloanele unui fişier de date. Separatorul de coloane se consideră a fi caracterul '\t'.
  Comanda ed pentru a realiza acest lucru este:
  1,$s/\(.*\) \(.*\)/\2 \1/
  Expresia regulată \(.*\) \(.*\) selectează toate caracterele pâna la primul '\t' şi le memorează în registrul 1, respectiv toate caracterele de după '\t' şi le memorează în registrul 2.
  În rest este o substituţie simplă pe toata lungimea fişierului.

3.2. Să se precizeze o sesiune de editare folosind vi în care este necesară adăugarea unei linii la începutul fişierului.
  Secvenţa de comenzi este următoarea:
  $vi nume_fis
a<se introduc liniileEsc
:wq

3.3. Un program editat poate să nu fie suficient de lizibil, mai ales când acesta este editat cu un editor nou. Cum se poate indenta rapid o sursă c ?
  În acest caz există o soluţie foarte comodă şi anume folosirea comenzii cb ( C Beautifier). Efectul comenzii este indentarea programului C preluat de la intrarea standard şi transmiterea lui către ieşirea standard.
 
4. Probleme propuse

4.1. Cum se poate include rezultatul unei comenzi într-un fişier ? Ce realizează comanda :nr! comanda ?
4.2. Cum se poate compila un program direct din vi ?
4.3. Cum se poate edita şi depana rapid un program ?
4.4. Se presupune că în directorul curent există trei fişiere: unu, doi, trei. Să se explice rezultatele afişate de comenzile de mai jos în locurile unde apare caracterul '?'.
       $ln trei patru              $pwd                       
       $ls -l                      /usr/adi                   
       ?                           $cd /usr/gabi              
       $rm trei                    $ln /usr/adi/patru         
       ?                           $ls -l                     
       $ls -l                      ?                          
       ?                           $cd ..; rm -r gabi         
  Ce se poate spune despre comanda ln în comparaţie cu cp ?
4.5. Care este efectul următoarelor comenzi ?
       ls -l m[a-df-z]*            mv *.* ./adi               
       cp ../fis* .                rm *.o ???                 
       echo *[!0-9]                cat f*.c                   
       echo [A-Z]*                 ln unu doi                 
4.6. Ce realizează următoarele comenzi ed ?
       / ... /                       /^[A-Z]/                   
       1,$s/^/    /               1,$-3s/[^a-zA-Z]//g        
       8,9s/da$/na/            .,+5s/^.\{10\}//           
       .,$s/\.$/ /p               g/ee/s/^./#&/p             
4.7. Ce semnifica următoarele expresii regulate ?
       ^$                         .\{7,\}                    
       e.*e                       ^\(.\)                     
       []a-z]                     ^\(.\).*\1$                
       [A-Za-z]\{4,7\}         /[Tt]he/                   
4.8. Folosind comenzi Unix şi comenzi editor să se obţină un fişier care să conţină pentru fiecare utilizator din sistem numele complet ( câmpul 5 din fişierul de parole) şi login-ul său.
4.9. Să se corecteze programul C de mai jos folosind unul dintre editoarele studiate.
min( argc. argv) {
print( "Anul % are laborator de SO\n", argv[1])
}
4.10. Cunoscând comenzile Unix cp şi mkdir să se scrie o secvenţă de comenzi care să copieze un director existent ca subdirector al directorului curent. Comenzile se vor separa prin caracterul ;.