Administrare server open source

Platforma de hosting cu software liber, gratuit, open source.

sed„, dupa cum ii spune numele, este un stream editor – adica filtreaza textul care i se paseaza, text care poate fi modificat. Un caz care poate fi intalnit este eliminarea liniilor goale dintr-un text. Ca sa eliminam liniile goale trebuie sa specificam operatorul „d„. Pentru inceput sa cream un fisier care va contine cateva randuri de text separate de linii goale:

[sergiu@localhost ~]$ cat > test.txt
prima linie
 
a doua linie
 
 
 
a treia linie
[sergiu@localhost ~]$

Ca sa afisam continutul fisierului eliminand liniile goale putem folosi „sed” dupa cum urmeaza:

[sergiu@localhost ~]$ sed '/^$/d' test.txt 
prima linie
a doua linie
a treia linie
[sergiu@localhost ~]$

Prin „^$” ii spunem editorului ca partea care ne intereseaza e un rand gol – inceput de rand reprezentat de caracterul „^” urmat imediat de un sfarsit de rand reprezentat de caracterul „$„. Daca pe una din liniile goale exista spatii filtrul va functiona doar daca specificam intre „^” si „$” un numar nelimitat de spatii, adica schimband regula in „^\s*$” – „\s*” ii spune editorului ca un spatiu poate sa apara de zero sau mai multe ori intre inceputul si sfarsitul liniei.

Un exemplu asemanator putem face pentru a elimina toate comentariile dintr-un script. Stim ca in scripturile shell comentariile se fac prin plasarea caracterului „#” inainte de comentariu. Pentru a curata un fisier de comentarii vom inlocui regula „^$” cu caracterul „#„. Astfel pentru eliminarea comentariilor vom rula comanda:

[sergiu@localhost ~]$ sed '/#/d' test.txt

Acelasi „sed” poate fi folosit pentru a converti datele de tip CSV in TSV. Pentru asta vom folosi operatorul „s„:

[sergiu@localhost ~]$ cat > test.txt 
a,b,c,d      
e,f,g,h
i,j,k,l
[sergiu@localhost ~]$ sed 's/,/\t/g' test.txt 
a	b	c	d
e	f	g	h
i	j	k	l
[sergiu@localhost ~]$

Acelasi utilitar poate fi folosit si cand avem o lista de URL-uri care dorim sa le transformam rapid in linkuri care sa poata fi incluse intr-o pagina HTML, cum e in cazul urmator:

[sergiu@localhost ~]$ cat > test.txt 
http://www.lamp.ro
http://www.regex.ro
http://www.nethelp.ro
[sergiu@localhost ~]$ sed 's|http://\([a-zA-Z0-9.:\/?\&=~%+_#-]*\)|<a href=\"http://\1\">\1</a>|g' test.txt 
<a href="http://www.lamp.ro">www.lamp.ro</a>
<a href="http://www.regex.ro">www.regex.ro</a>
<a href="http://www.nethelp.ro">www.nethelp.ro</a>
[sergiu@localhost ~]$

Observati ca pentru a evita utilizarea caracterului „/” care ne-ar incurca in cazul de fata am folosit caracterul „|” iar „sed” a stiut sa il citeasca automat ca delimitator.

Bineinteles, „sed” poate face mult mai mult decat am prezentat aici. Folosindu-ne de expresiile regulate putem crea reguli complexe de filtrare care sa le folosim in timp real pentru a cauta in fisiere mari, cum ar fi fisierele log, informatiile care ne intereseaza. Pentru mai multe detalii legate de utilizarea „sed” va recomand sa cititi pagina de manual.

Linux

8 Responses so far.

  1. alinrus says:

    expresii regulare, cred ca ii mai corect 🙂

  2. alinrus says:

    adica e pe undeva o sursa sigura de aflat cum ii corect? nu-s lamurit nici eu

  3. Sergiu says:

    Conform dictionarului si „regular” si „regulat” inseamna „ceva ce se supune unei reguli”. Ambele variante sunt corecte, dar m-am obisnuit cu „expresii regulate”. Poate e din cauza ca in general cand aud de „regular” ma gandesc la o actiune repetitiva, care se intampla cu regularitate, dar intr-un final e tot una 😛

  4. Viorel says:

    Salut, Sergiu
    Am o problema, m-am muncit mult insa nu ii dau de capat, am incercat cu sed, cu tr… daca poti da-mi cateva indicii
    din asa :
    # cat -A Abonati1.txt
    1^I4560^I^IBirsa Semion (24.07.06)^I^I^I^I^IMD-2003, str. Alexei Mateevici 27^I^I^I65-00^I^M$
    2^I4312^I^IBostan Feodor (19.06.06)^I^I^I^I^IMD-2003, str. Alexei Mateevici 56 A^I^I^I65-00^I^M$
    3^I4315^I^IBurlea Gheorghe (29.08.06)^I^I^I^I^IMD-2003, str. Alexei Mateevici 47 A^I^I^I65-00^I^M$
    4^I5995^I^IBurlea Tudor (12.03.08)^I^I^I^I^IMD-2003, str. Alexei Mateevici 15A^I^I^I65-00^I^M$
    5^I4320^I^ICiobanu Elena (26.05.06)^I^I^I^I^IMD-2003, str. Alexei Mateevici 51^I^I^I65-00^I^M$
    6^I4310^I^ICodreanu Dumitru (02.07.05)^I^I^I^I^IMD-2003, str. Alexei Mateevici 49^I^I^I65-00^I^M$

    sa fie de asa gen
    # cat -A Abonati1.txt
    1,4560,Birsa Semion,65-00^M$
    2,4312,Bostan Feodor,65-00^M$
    3,4315,Burlea Gheorghe,65-00^M$

    Multumesc anticipat
    Viorel

  5. Sergiu says:

    Nu e complicat, dar am o nelamurire. Asa apar in fisierul text caracterele cu ^ in fata? Sau sunt caractere speciale?

  6. Viorel says:

    Caracterul „^I” separa coloanele unele de altele
    Asta e un fisier .xls care e salvat in .txt pe care trebuie sa-l ajustez asa cum ti-am explicatm mai sus
    cu sed, nu prea am reusit sa fac mare lucru dar cu awk a mers, iata comanda:
    # awk ‘/str/ {print $1,$2,$3,$4,$11}’ Abonati.txt > Abonati3.txt
    Viorel

  7. Viorel says:

    Salut, Sergiu]
    Ai putea sa ma ajuti?

    cu ce as putea sterge parantezele cu tot cu informatia cuprinsa intre ele?

    262,318,Boltins Carolina (19.12.06),65.00
    sa fie
    262,318,Boltins Carolina,65.00
    multumesc

  8. Sergiu says:

    Salut,

    Incearca asa:

    [user@localhost ~]$ sed 's/([0-9.]*)//g' -f fisier.txt