Pređi na sadržaj

Programski alat sed

S Vikipedije, slobodne enciklopedije

sed (skraćeno od engl. stream editor) je alat koji služi za razčlanjivanje i menjanje teksta, korišćenjem jednostavnog i kompaktnog programskog jezika, pod Unix operativnim sistemom. sed je razvijan od 1973 do 1974. godine, na njemu je radio Lee_E._McMahon , koji je radio u Bell_Labs. Danas je sed dostupan na većini operativnih sistema. sed je zasnovan na skript karakteristikama interaktivnog editora ed ("editor", 1971) i starijeg qed[mrtva veza] ("quick editor", 1965-66). sed je bio jedan od najranijih alata za podršku regularnih izraza i ostaje u upotrebi za obradu teksta, zbog komande zamene (tj. supstitucije). Drugi slični alati uključuju AWK i Perl.


Istorija alata sed[uredi | uredi izvor]

sed je jedna od prvih komandi opetarivnog sistema Unix napravljena sa namerom da se iz komandne linije može obrađivati datoteka sa podacima. Evoluira kao prirodni nalednik popularne grep komande. Sintaksa sed -a, naročito korišćenje / za podudaranje uzoraka(engl. pattern matching) i s/// za zamenu (jednog dela teksta drugim), orijentisani ka ed-u ,koji je preteča sed-a, koji je bio u upotrebi u to vreme, i sintaksa regularnih izraza uticali su na druge jezike, pre svega na ECMAScript i na Perl. Kasnije je razvijen moćni AWK, koji je omogućio da se značajne obrade teksta urade korišćenjem skriptova. AWK i sed se smatraju pregeneratorima i inspiracijom za Perl,imali su uticaj na sintaksu i sematiku ovog jezika,posebno na podudaranje uzoraka i zamenu.

GNU sed ima nekoliko poboljšanja,koja uključuju uređivanje fajlova u mestu (engl. in-place editing ). Super-sed je proširena verzija sed-a koja uključuje regularne izraze kompatibilne sa Perl-om. Druga varijanta sed-a je minised, GNU_Project koristio je minised tokom pisanja nove verzije sed-a zasnovane na novim GNU bibliotekama za rad sa regularnim izrazima. Sadašnji minised sadrži neke dodatke za BSD sed, ali nije toliko bogat kao GNU sed. Njegova prednost je u tome što je veoma brz i koristi malo memorije.

Način rada[uredi | uredi izvor]

sed je linijski orijentisan alat za obradu teksta: učitava tekst,liniju po liniju,sa ulaza što može biti tok(engl.stream) ili datoteka,u unutrašnji bafer koji se na engleskom zove 'pattern space'. Učitavanjem linije počinje ciklus. U unutrešnjem baferu sed primenjuje jednu ili više oparacija koje su definisane pomoć sed skripta. sed obuhvata oko 25 komandi za rad sa tekstom. Za svaku liniju se nakon izvršavanja skripta ispisuje na izlaz modifikovanu ulaz (dobijen primenom operacija definisanih skriptom nad tom linijom) i ,započinje se novi ciklus sledećom linijom ulaza. Moguće je podesiti i da se skript drugacije ponaša nakon izvršenih operacija nad tekstom navođenjem sed opcija i skript komandi,npr. d za brisanje sadržaja koji je u baferu,q za izlaz,N za automatsko dodavanje nove linije u bafer i tako dalje. Tako sed skript odgovara telu petlje koja iterira kroz linije toka, gde sama petlja i promenljiva petlje (trenutni broj linije) su implicitni i održava ih sed.

sed skript može se zadati iz komandne linije(-e opcija) ili čitanjem iz datoteke (-f opcija). Komande sed skripta mogu koristiti opcione adrese, u smislu rednog broja linije ili regularnih izraza. Adresa se određuje prilikom izvršavanja komande. Na primer, komanda 2d će primeniti komandu d(brisanje) na drugu liniju ulaza (kao izlaz dobijamo sve linije ulaza osim druge), dok se naredbom /^ /d brišu svi redovi koji počinju razmakom. Specijalan odvojeni bafer,koji se na engleskom zove 'hold space', koriste neke naredbe sed-a za čuvanje teksta između dva ciklusa. sed-ov komandni jezik ima samo dve promenljive("hold space" i "pattern space") i GOTO naredbu koja služi kao naredba grananja. Ipak,jezik je Tjuring kompletan,čak su i neke igrice pisane pomoću sed skriptova: Sokoban, Arkanoid, šah i tetris.

Naredba 10q prvih 10 linija ulaza i zaustaviće se.

Korišćenje[uredi | uredi izvor]

Naredba zamene[uredi | uredi izvor]

Sledeći primeri pokazuju tipične, a najčešće, upotrebe sed-a,za zamenu. Ovaj način upotrebe je originalna motivacija za sed:

sed 's/regexp/replacement/g' inputFileName > outputFileName

U nekim verzijama sed-a, izrazu mora da prethodi -e kako bi ukazao da izraz sledi. s označava zamenu(engl. substitute),dok g označava globalno (engl. global),što znači da će svaka linija koja zadovoljava uslov biti obrađena. regexp je regularni izraz (tj. obrazac) koji bi trebalo da zadovolji onaj deo teksta koji želimo da izmenimo, replacement predstavlja onaj tekst kojim menjamo. Dakle,deo teksta koji zadovoljava regularni izraze menjamo sa onim koji je naveden kao replacement u gornjem primeru. Kosa crta (/) konvencionalni simbol,potiče od znaka za "pretragu" u ed-u,mada se bi se mogao koristiti bilo koji drugi znak za povećanje čitljivosti ako se taj znak ne nalazi u regexp ili replacement delu naredbe. Komanda zamene potiče od ed-ove komande "nađi i zameni".

Na primer, sed -r "s/(cat|dog)s?/\1s/g" zamenjuje svako pojavljivanje reči "cat" ili "dog" sa "cats" ili "dogs", ako je u tekstu već pisalo "cats" ili "dogs" nema izmene. (cat|dog) je prvi(u ovoj naredbi i jedini) sačuvan podizraz u okviru regularnog izraza,a \1 se "čuva" pronađen deo teksta koji zadovoljava prvi podizraz. Pronađen deo teksta koji zadovoljava prvi podizraz iza kog može biti slovo "s"(jedno ili nijedno) zamenjuje tim pronađen delom teksta kom je nadovezano slovo "s".

Druge sed naredbe[uredi | uredi izvor]

Osim zamene, drugi oblici jednostavnih obrada su mogući, koristeći neke od 25 komandi koje sed nudi. Na primer, sledeća upotreba komande d za brisanje linije koje su ili prazne ili samo sadrže razmake:

sed '/^ *$/d' inputFileName

Regularan izraz "^ *$" odgovara redovima koji jedino sadrže znak razmaka nula,jedan ili više puta.

Znak "^" (sidro) je oznaka za početak reda,označava da red počinje onim što sledi neposredno nakon ovog znaka.

Znak "$" (dolar) je oznaka za kraj reda, označava da se red završava onim što je neposredno pre ovog znaka.

Ako se upotrebe oba znaka na način kao u datom primeru, onda se traži red koji sadrži samo ono što je opisano regularnim izrazom između znakova "^" i "$" (odizraz regularnog izraza je regularni izraz).

Znak "*" (zvezdica) označava da podizraz koji mu prethodi može se pojavljivati u tekstu koji zadovoljava ceo regularni izraz nula,jedan ili više(konačan,ali neograničen broj) puta.

Složene sed konstrukcije su moguće, što mu omogućava da posluži kao jednostavan, ali visokospecijalizovan programski jezik. Tokom kontrole, na primer, može se upravljati upotrebom labele i instrukcije grananja b. Instrukcijom b preskočiće se na blok narebi koji sledi nakon labele b.

sed kao filter[uredi | uredi izvor]

Pod Unix operativnim sistemom,sed se često koristi kao filter prilikom pajpovanja:

generate_data | sed 's/x/y/g'

Izlaz programa generate_data pomoću sed-a se izmeni t.d. se svako pojavljivanje slova "x" zameni sa "y".

Navodnici oko izraza nisu obavezni,ako upit postavljamo iz konzole (komandne linije),osim kao shell,inače,ne tumači izraz kao jednu reč. U ovom primeru s/x/y/g nema dvosmislenosti,pa je dozvoljeno isti upit napisati na sledeći način:

generate_data | sed s/x/y/g

Kako god, navodnici se često koriste da bi bilo jasnije i čitljivije,neophono ih je koristiti ako izraz sadrži beline (npr. 's/x x/y y/'). Češće se koriste jednostruki navodnici,da bi se izbeglo shell-ovo tumačenje $ kao shell promenljive. Dvostruki navodnici se koriste,kao takvi "s/$1/$2/g", kada se dopušta da shell zameni argumente komandne linije ili druge shell promenljive.

Ograničenja i alternative[uredi | uredi izvor]

Iako jednostavan i ograničen,sed je dovoljno moćan za mnoge poslove. Za sofisticiraniju obradu, koriste se moćniji jezici kao što su AWK ili Perl. Oni se posebno koristite ako obrađujući liniju na složeniji način, iako proizvoljno komplikovane transformacije su,u principu,moguće korišćenjem sed-a.

S druge strane, za jednostavnije poslove, postoje specijalizovani Unix alati kao što su grep (štampa linije koje se podudaraju sa obrazcem), head (štampa prvi deo fajla), tail (štampa poslednji deo datoteke), i tr (prevođenje ili brisanje znakova) su često bolji izbor od sed-a. Za specifične zadatke koje su dizajnirane da izvrše, takvi specijalizovani alati su obično jednostavniji, jasniji i brži od opštijeg rešenja kao što je sed.

ed/sed naredbe i sintaksa se koriste kod nekih programa i danas,npr. tekst editori vi i vim. Analogno sa ed/sed postoje sam/ssam.