Dávkový editor Sed
O programu sed
Sed je neinteraktivni kontextovy editor urceny zvlaste pro tyto problemy:
- editace prilis velkych souboru
- editace libovolne velkych souboru v pripade, ze posloupnost prikazu je pro interaktivni editaci prilis komplikovana
- soucasna "globalni" editace behem jednoho pruchodu
SYNOPSIS
sed [-n] [-i] {-f prog_soubor|program} [soubor ...]
OPTIONS
- -f soubor
- Tato volba rika, ze nasleduje soubor, ktery obsahuje program (prikazy editoru). V souboru muze byt na samostatnych radkach vice programu. Druhou mozností je napsat program přímo na příkazovou řádku (do uvozovek).
- -n
-
Radky souboru se nekopiruji na standardni vystup, k
rom pouziti instrukce
p
. - -i
- Provede zmeny primo v souboru (neposila radky na standardni vystup, ale edituje rovnou vstupni soubor).
Struktura programu
Program (instrukce pro editor sed
) je tvoren jednim, nebo nekolika radky, ve tvaru:
[adresa[,adresa]]instrukce[seznam_argumentu]
- adresa
- Je-li adresa vynechana, spracovavaji se vsechny radky. Jinak urcuje, ktere radky se maji instrukcemi zpracovavat a ktere preskocit.
- instrukce
- Editovaci prikaz modifikujici text (napriklad instrukce na smazani radku, nahrazovani textu jinym textem atd.)
- argumenty
- Instrukce muze mit nejake argumenty, ktere zpresnuji jeji cinnost
Postup zpracovani textu
- cte se jeden radek ze vstupniho souboru
- cte se prvni prikaz z programoveho_souboru a jestlize adresa tohoto prikazu odpovida radku, provede se s ne nem instrukce.
- Z programoveho souboru se precte dalsi prikaz a jestlize adresa vybere vstupni radek, provede se.
- Krok 3 se opakuje tak dlouho, dokud se nevycerpaji prikazy prog_souboru
- Pokud ve vstupnim souboru existuje dasi radek, pokracuje se krokem 1
Jinak receno, sed
prochazi soubor pouze jednou a na radku za radkem
provede vsechny prikazy ze souboru prog_soub
.
Pro program zadany na prikazove radce je postup jednodussi. Provadi se jen tento jeden program radek po radce.
Adresa
[adresa[,adresa]]
Adresa je nepovinna (pak se zpracovavaji vsechny radky) a muze se skladat z:
- cislo
- Vybere radek daneho poradoveho cisla.
- $
- Posledni radek posledniho souboru uvedeneho na prikazovem radku.
- /regularni vyraz/
- Adresa vybira radky odpovidajici regularnimu vyrazu
Pokud ma instrukce druhou adresu (oddelenou carkou), instrukce se provadi na skupinach radek. Prvni adresa vybira prvni radek v prvni skupine. Druha adresa vybira posledni radek prvni skupiny. Po vybrani posledniho radku ve skupine, zacina proces hledani znovu.
Modifikátory
- !
- Neguje adresu. Instrukce budou aplikovany na vsechny radky krome radku vybranych adresou, ktera je casti prikazu. (Vykřičník se umisťuje mezi adresu a instrukce).
- {}
- Pokud je skupina instrukci uzavrena do {}, pak jedna adresa (nebo dvojice adres) vybere radek, na kterou se aplikuje cela skupina instrukci.
Instrukce
- d
- (delete) Nezapise vybrany radek na standardni vystup. Po provedeni teto instrukce s precte dalsi vstupni radek a zacina se prvnim prikazem v prog_soub.
- n
- (next) Cte se dalsi vstupni radek. Vypise se prave vybrany readek a zacne se zpracovavat novy radek pomoci dalsiho prikazu v prog_souboru
- a
- (append)
Pripoji k vybranemu radku jednu nebo vice dalsich
radku. Pokud tato instrukce neobsahuje adresu, radky se pripojuji ke
kazdemu vstupnimu radku. Tato instrukce nemuze mit dve adresy.
Format teto instrukce je:
[adresa]a\ text\ text\ . . text
Kazdy radek pripojovaneho textu (krome posledniho radku) musi koncit zpetnym lomitkem. Pripojeny text se vzdy vypise na standardni vystup bez ohledu na argument -n. - i
-
Identicka instrukce s instukci
a
s vyjimkou toho, ze text se umisti pred vybrane radky. - c
- (change)
Instrukce je podobna instrukcim
a
ai
s tim rozdilem, ze vybrane radky jsou zmeneny tak, ze obsahuji novy text. Tato instrukce muze mit dve adresy. Pokud jsou uvedeny dve adresy, cely rozsah radek je nahrazen jednim novym textem - s
- (substitute)
Nahrazuje v radku za vzor nahrazujici retezec.
Je podobna instrukci nahrazeni v obrazovkovem editoru vi:[adresa[,adresa]]s/vzor/nahrazujici_retezec/[g][p][w]
vzor - regularni vyraz, ktery je ohranicen libovolnym znakem krome mezery nebo noveho radku. Nahrazujici retezec zacina bezprostredne po druhem oddelovaci a musi byt ukoncen stejnym oddelovacem. Nahrazujici retezec muze obsahovat znak &, ktery je nahrazen retezcem, ktery vyhovuje vzoru. Pokud jsou ve vzoru casti vzoru uzavrene do uvozovek, lze se na ne v nahrazujicim retezci odkazovat pomoci zpetneho lomitka a poradoveho cisla zavorek (\1 pro prvni zavorku atd.).
Pokud se nepouzije priznakg
(global), nahrazuje se pouze prvni vyskyt vzoru.
g - tento priznak zpusobi nahrazeni vsech (neprekryvajicich se) vyskytu vzoru na vybranem radku (nejen prvniho). - p
- (print)
Vybrane radky se posilaji na standardni vystup. Zapis se provadi
okamzite a nasledne zmeny nejsou zohlednany. Tato instrukce ma vyssi
platnost nez argument
-n
z prikazoveho radku. - w
- (write) Odesila radky do souboru. Po instrukci musi nasledovat mezera a jmeno souboru, do ktereho se bude zapisovat.
- r
- (read) Cte obsah specifikovaneho souboru a pripoji ho k vybranemu radku. Tato instrukce nemuze mit dve adresy. Po teto instrukci musi nasledovat mezera a jmeno souboru.
EXAMPLES
Odstraňení všech prázdných řádků ze soboru (Adresa je regularni vyraz (/^$/,
kteremu vyhovuji jen prazdne radky. Instrukce je d
(delete)).
Prazdny radek neobsahuje nic, tedy mezi zacatkem radku (^) a koncem radku ($) neni nic.
Následující příklad odstraní první a poslední řádku:
Smaže poslední řádku, pokud je prázdná.
Mame soubor /etc/passwd
, ve kterem jsou jednotliva pole na radku oddelena dvojteckou.
Chceme vytisknout pouze prvni a treti pole kazdeho radku, ale treti pole se
zobrazi jako prvni.
...
30 wwwrun
1000 petr
114 tomcat
...
Popis pouziteho reg. vyrazu:
- [^:]*
- libovolny pocet libovolnych znaku krome zaku :
- \(...\)
- vyraz pro opakovane pouziti v nahrazujicim retezci
- \2
- druhy zavorkovy vyraz (treti pole)
- \1
- prvni zavorkovy vyraz (prvni pole)
Vice informaci o regularních výrazech je v kapitole Regulární výrazy.