Faceți căutări pe acest blog

sâmbătă, 23 iunie 2012

Manipulare fișiere text în linia de comandă

 Cum tocmai am scris câte ceva despre nano, poate-ar fi indicat să pomenesc puțin alte modalități simple de a lucra cu fișiere text.

1- Creare fișiere text
touch nume_fișier      = nume_fișier trebuie înlocuit cu numele real, iar dacă destinația e diferită de directorul curent atunci cu calea către el, de exemplu cu ~/Desktop/utile.txt (extensia .txt este pur informativă, nu este neapărat necesară)

touch test     = va crea în directorul curent un fișier numit test
touch Documents/diverse/test1   = va crea fișierul test1 în directorul Documents, subdirectorul diverse;
 Oarecum similar putem crea fișiere ca rezultat al unor comenzi, direcționând outputul către nou creatul fișier:
cat fișier1> fișier-nou
man touch > manual-touch
echo > nume-dorit-fișier   ( > nume-fișier )
echo "așa putem crea un fișier" > fișier_test    (în primele două cazuri, fișierul va conține outputul comenzii respective, a treia comandă va genera un fișier gol, fără conținut, iar în ultimul exemplu va conține chiar textul dintre ghilimele)

2- Ștergere fișiere
rm nume_fișier
rm ~/Documents/diverse/utile    = va șterge fișierul utile din directorul /home/user/Documents/diverse; dacă ne aflăm în directorul /home/user putem sări peste ~ sau /home/user!
 Bănuiesc că nu e necesar să amintesc de comenzi banale pentru mutare fișiere (mv fișier destinație) sau copiere (cp fișier destinație)...

3- Afișare conținut fișier
cat fișier
cat ~/Desktop/test/test1           = va afișa în terminal conținutul fișierului test1 din /home/user/Desktop/test
cat -n Desktop/test/test1        = va afișa în terminal liniile numerotate
cat Desktop/test/test1 | head  = va afișa doar primele 10 linii din fișier
cat Desktop/test/test1 | tail  = va afișa doar ultimele 10 linii ale fișierului
tac Desktop/test/test1     = va afișa conținutul începând cu ultimele linii, exact inversul lui cat (deci de la sfârșit către început)


4- Modificare/ Suprascriere fișier
echo "text-de-adăugat" > cale-fișier
echo "text-de-adăugat" >> cale-fișier
 Observați diferența dintre cele două comenzi anterioare? Este vorba de numărul scrierii simbolului >, o dată în prima comandă (ceea ce înseamnă că fișierul va fi suprascris, textul conținut va fi COMPLET înlocuit de acel text, ATENȚIE!), și de două ori în a doua comandă (ceea ce înseamnă că textul din comandă va fi adăugat la finalul fișierului!).
echo "testare suprascriere" >> Desktop/test/test1   = va adăuga la finalul fișierului textul dintre ghilimele.

sed -i '1i text de introdus în fișier' nume-fișier                     = va introduce în prima linie a fișierului textul dorit
sed -i '3i așa se procedează' test                                              = adăugăm textul dorit în linia a treia a fișierului țintă (1i= prima linie, 2i= a doua line, etc)


sed 's/tipar1/tipar2/' fișier1 > fișier2        = va înlocui tipar1 cu tipar2 în fișierul dat (fișier1) și va salva modificările în fișier2
sed 's/cal/bou/' test >test-mod                    = va înlocui în fișierul test cuvântul cal cu bou, iar textul/ conținutul modificat va fi salvat în aceeași locație sub numele test-mod; trebuie să știți că cuvintele ce conțin tiparul ”cal” (sau orice alt string de căutare dat) vor suferi aceleași modificări ale compoziției!

Pentru a vedea cum se pot înlocui DOAR potrivirile exacte, adică DOAR cuvintele dorite, nu și cele ce conțin tiparul de căutare vedeți comenzile în următoarele două imagini, nu știu prea bine de ce dar comenzile nu apar corect afișate în text...




sed 's/cal/bou/g' test >test-mod                     = prima comandă caută și înlocuiește doar primul termen găsit pe o linie de text, pentru a înlocui toți termenii găsiți pe linii adăugăm g ca în prezenta comandă, similar 3 va înlocui pe fiecare linie al treilea termen găsit (sed 's/cal/bou/3' test >test-mod), 6 al șaselea termen, etc.
 În cazul în care doriți ca fișierul inițial să fie modificat (și nu să rămână neschimbat, modificările fiind salvate în alt fișier) pasăm sed opțiunea -i (--in-place) și doar fișierul sursă:
sed -i 's/cal/bou/g' test                               = va înlocui cal cu bou DIRECT în fișierul test, inclusiv cuvintele ce conțin tiparul (calculator, acalmie, etc)

 Înlocuire multiplă termeni: comenzile în screenshotul următor:

 Ok, în exemplele anterioare cunoșteam numele fișierului în care făceam modificări, ce facem dacă nu știm numele și locația fișierelor ce conțin textul pe care-l dorim înlocuit? Căutăm fișierele:
find . -type f -exec sed -i s/text-inițial/text-final/g {} +
find . -type f -exec sed -i s/Necunoscut/Anonim/g {} +


5- Căutare fișier și conținut fișiere
 Sarcini realizate cu ajutorul find sau locate și grep (dați clic pe aceste linkuri pentru a citi materialele cu pricina).

6- Comparare fișiere după conținut
cmp fișier1 fișier2
diff fișier1 fișier2
cmp Desktop/test/test Desktop/test/test1     = cmp verifică diferențele după caractere, nu după linii, de aceea nu este foarte relevant, ne ajută mai mult să vedem dacă cele două fișiere sunt identice
comm Desktop/test/test Desktop/test/test1  = compară fișierele linie cu linie și afișează liniile comune și cele individuale, specifice unui singur fișier
diff Desktop/test/test Desktop/test/test1       = arată diferențele dintre fișiere
diff3 fișier1 fișier2 fișier 3                                   = afișează diferențele dintre trei fișiere

 Un material interesant pe aceeași temă, mult mai cuprinzător în anumite aspecte, găsiți aici: http://linuxfans.ro/viewtopic.php?f=31&t=96!
 Merită citite toate postările de acolo, îmi place la nebunie comanda cu vremea, am făcut-o deja funcție bash:
 wget -qO - http://www.meteoromania.ro/index.php?id=58 | sed -n '/FiltersEnabled/,/applyCssFilter/ p' | sed 's/;/ /g;s/&/ /g;s/>/ /g;s/"//g;s/C

2 comentarii:

  1. Este binevenită ideea, mereu găsești ceva apetisant :))
    Aici eu am încercat să scriu... http://linuxfans.ro/viewtopic.php?f=31&t=96

    RăspundețiȘtergere
  2. Wow, da' știu că avem aceleași pasiuni/ preocupări...
    Am trecut linkul în material, sunt chestii interesante, merită citite!
    Frumos scris, felicitări!

    RăspundețiȘtergere

Back to top