SED


Obsah:


Proc umet sed ed a vi?

Tak jsem se po dlouhe dobe rozhoupal pustit se do tri editoru:ed,sed,vi. Jsou to ponekud zvlastni editory, ktere vznikly jeste v dobach pocitacoveho praveku. Tak asi v 70. az 80. letech. Presto se dodneska udrzely a jsou v kazde instalaci unixu. A razi si pomalu cestu i do dosu. Treba watcom vi dodava jako svoje standardni programatorske prostredi a je to opravdu zazitek videt vi ve woknousech! I v unixu existuje mnoho klonu-elvis, vim, vile atd.. a vi emulation mode je nepostradatelne i v emacs.Jejich ovladani je pri nejmensim podive. Kdo o nich nic nevi neni schopen z nich ani vyskocit. Je hodne uzivatelu unixu, kterym pri nastartovani vi nezbyza nez ctrl+Z a kill.. Vetsina lidi, kteri vi neznaji se strasne podivuje, kdyz nastartuju vi a zacnu v nem bastlit.. Rikaji veci stylu jako ze vi dneska uz nikdo nepouziva a jedine co ma smysl je joe. Presto je ale velka cast uzivatelu, ktera pouziva vi. Rekl bych ze jsou priblizne tri tabory... jedni pouzivaji joe,ted nebo wpe druzi emacs a treti vi.

Ja osobne vi a sed povazuju za zcela nenahraditelne utility a neumim si zivot bez nich predstavit..Myslim si, ze vi je takovy dobry komprovmis mezi poctem funkci editoru a jeho delkou..na jedne strane jsou editory wordstaroveho typu joe nebo wpe(borlandi IDE for unix), ktere jsou priserne hloupe a na druhe strane emacs, to je ale zase obludne velke-18MB. A prez moji snahu do neho proniknout se mi to jeste nepodarilo. Presto ze neobsahuji programovaci jazyk uz jsem v nich videl veci jako hledani nejkratsi cesty v bludisti, reseni hanojskych vezi atd..

Zacnu editorem sed. Protoze je to podle me uplne nejnepostradatelnejsi editor z teto trojice. Neni to totiz normalni editor ale je to davkovy, neinteraktivny, radkovy editor. (to vypada odporne :) Neslouzi tedy k bezne editaci ale k davkovemu zpracovani fajlu. Je to tedy velmi jednoducha a sikovna utilita, ktera muze fungovat jako hodne standardnich utilitek-grep, replace ,unix2dos, dos2unix a fura dalsich. Na jeho zaklade pracuje fura davek na ruzne prekousavani textu. Neni to programovaci jazyk ale presto jsem uz v nem videl hodne. Nakonec v prikladech ukazu jak se dela par zakladnich programku..

Volani

sed [-n] -f soubor_z_programem [seznam_souboru]
sed [-n] program [seznam_souboru]

Sed potom pomoci programu kopiruje a upravuje radky se seznamu souboru a vypisuje je na obrazovku. Kdyz neuvedete souboru vstup je z stdin.

Prepinace

-f
jmeno urcuje soubor z programem
-n
nebude nic vypisovat pokud to neni urceno instrukci print..

Prikaz

Prikaz se sklada z:
[adresa[,adresa]] instrukce [argumenty]
Adresy nemusite uvadet-sed potom provede instrukci na kazdou radku. sed pracuje takto:

Pro vsechny radky:

Adresy

Adresu muze byt: Pokud neni uvedena zadna adresa instrukce se provede na kazdou radku. Pokud je uvedena jedna adresa instrukce se provede na radkach, ktere splnuji adresu( obsahuji regularni vyraz, nebo maji uvedene cislo.. Dve adresy vykonaji instrukci na vsech radkach mezi-treba 20,$ provede instrukci na kazde radky od 20 nahoru.

Instrukce

Sed ma nekolik instrukci, ktere slouzi k modifikaci vystupu:
d(delete)
Mazani-sed radky nevypise..Tak treba nemusite vypsat radky, ktere zacinaji na #:
  sed /^#/d <soubory>
co jsme napsali? to mezi // je regular expresion-tedy adresa, ktera neco vyhledava. ^ znamena novy radek a # je #. Tedy /^#/ je splneno na kazdem radku, ktery zacina na #. Potom se provede instrukce d, ktera radek smaze Po provedeni teto instrukce se uz dalsi neprovadi a pokracuje se dalsim radkem.

A tento program supluje /dev/null :)

  sed d
n(new)
Nacte dalsi radek. Akutalni radek zobrazi a novy zpracovava dalsim prikazem
a(append)
Ta pripojuje jeden nebo vic radku k aktualnimu. Kdyz pred ni neni adresa pripojuje ke vsem radkum. Nejdu tu udavat dve adresy. format:
  [adresa] a\
   text \
   text \
   ...
   text
i(insert)
funguje stejne jako a ale pripojuje pred
c(change)
Tato intrukce funguje podobne jako a ale nacteny radek zrusi. Je mozne pouzit dve adresy. potom se vsechny radky mezi nahradi jednim, z novym prikazem.
s(substituce)
Jeji format je: [adresa[,adresa]s/vzor/nahrada/[g][p][w jmeno] Funkce potom nahradi vzor nahradou. Pokud nejsou uvedeny prepinace nahrazuje se pouze prvni vyskyt. Nahrada muze obsahovat &, kam sed vlozi vzor prepinace:
g
Budou se nahrazovat vsechny vyskyty vzoru
p
Budou se vsechny radky, kde se delala substituce posilat na stdout. Kdyz se bude delat vice substituci budou se i vickrat psat.
w
stejne jako p ale posila vystup do souboru jmeno
p(print)
Vypisuje radky na standartni vystup. Ignoruje prepinac -n
w(write) file
Vypisuje radky do souboru
r(read) jmeno
Prida dany soubor k radku.
l
Vytiskne redek a ridici znaky jako ^M apod nahradi ascii kodem a nebo \ kombinacema (\n,\r atd..)
Instrukci je samozdrejme vic. najdete je v man sed...

Ridici struktury

!
(not) Bude provadek instrukci na radcich, ktere nebyly vybrany
{}
Muzete do nich dat vice instrukci, ktere budou provadeny pri dane adrese.

Priklady

Tady vam ukazu jak je jednoduche udelat nekolik uzitecnych utilitek:

unix2dos

ktera prevadi z unixackeho na dosacky format textovych souboru
sed  "$ !s/$/^M/
$ s/$/^Z/
"
(pozor znak ^M a ^Z musite zadat opravdu jako znak ^M - V editoru vi se to dela pomoci ^V^M) Prvni radka se bude provaded na vsech radkach mimo posledni-pridavani ^M na konec posledni radky je spatne. V regular expresion znak $ znamena konec radky. Program tedy vyhleda vsechno konce radky a prida k nim znak ^M-prikaz substituce je jediny, kterym lze neco pridavat do radky. Druhy radek zpusobi, ze na posledni radce vstupu se prida jeste ^Z

dos2unix

sed "s/^M$//
$ /^Z$//"
Tento program vypere vsechny ^M na koncich radek a zrusi je. Potom na konci souboru najde ^Z a take jej zrusi.

Tim ale moznosti sedu nekonci. Takhle muzete udelat univerzalni filtr, ktery vam to jednou prevede do unixu a pak zase zpet do dosu:

sed "			 /*napred se postarame o dosacke radky..ty se 
                           daji snadno poznat
     /^M$/ {s/^M$//      /*pokud radka konci na ^M zrus ho*/
            p            /*vypis na obrazovku aktualni stav-dosackou
                           radku prevedenou na unix*/
            d	         /*ukonci provadeni teto radky(smaz ji)
           }
     /^Z$/ {s/^Z$//	 /*pokud radka konci na ^Z-posledni radka dos. 
                           fajlu zrus ^Z na konci*/
        p		 /*vypis ji a prerus jeji zpracovani*/
        d
       }
                         /*ted uz mema jistotu ze tu je unixova radka*/
     $ {s/$/^Z/	         /*kdyz je posledni pridej ^Z*/
        p		 /*vypis a prerus provadeni*/
        d
       }
     s/$/^M/		 /*a zbyla nam normalni unix radka...tak k ni 
                           pridame ^M*/
      "
No neni to sranda? Lepsi nez assembler!

Filtr na skolicky

Ve skolickach mam casto znaky < > a &, Pri prevadeni do html ale delaji zmatky Je treba je nahradit:
> -> &gt
< -> &lt
& -> &amp
To zaruci nasledujici script:
sed "
     s/&/\&amp/g
     s/</\&lt/g
     s/>/\&gt/g
      "
Ten je naprosto jednoduchy...typicky priklad pouziti subsituce:
/&/ vyhleda znak $
/\&amp/ to nahradi retezcem &amp...\& je tam misto & proto, ze & je take ridici a delal by tam nesmysly. \ jeho ucinek zastavi

whoami

Treba takto jde udelat prikaz whoami z prikazu who:
# who am i | sed 's/ .*//'
root

tail

tail +11 lze prepsat:
sed '1,10d'
(smaze radky 1-10)


Tento soubor je soucasti rozsahle sbirky skolicek na http://www.ucw.cz/~hubicka/skolicky

Take si muzete prohlidnout jeji puvodni textovou podobu

Nebo mi mailnout na hubicka@ucw.cz

Copyright (C) Jan Hubicka 1996