Dávkový editor Sed

O programu sed

Sed je neinteraktivni kontextovy editor urceny zvlaste pro tyto problemy:

  1. editace prilis velkych souboru
  2. editace libovolne velkych souboru v pripade, ze posloupnost prikazu je pro interaktivni editaci prilis komplikovana
  3. 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

  1. cte se jeden radek ze vstupniho souboru
  2. cte se prvni prikaz z programoveho_souboru a jestlize adresa tohoto prikazu odpovida radku, provede se s ne nem instrukce.
  3. Z programoveho souboru se precte dalsi prikaz a jestlize adresa vybere vstupni radek, provede se.
  4. Krok 3 se opakuje tak dlouho, dokud se nevycerpaji prikazy prog_souboru
  5. 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.

Ne všechny instrukce lze ovlivnit adresou.

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 a i 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 priznak g (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.

$ sed '/^$/d' soubor.txt

Následující příklad odstraní první a poslední řádku:

$ sed '1d' soubor.txt | sed '$d'

Smaže poslední řádku, pokud je prázdná.

$ sed '${/^$/d}' seznam.txt

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.

$ sed 's/\([^:]*\):[^:]*:\([^:]*\):.*/\2 \1/'  /etc/passwd
...
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.

Tento ukol by se pomoci awk resil takto:
$ awk 'BEGIN {FS=":"; OFS=" "} {print $3, $1}' /etc/passwd
Komentář Hlášení chyby
Created: 11.9.2005
Last updated: 13.7.2013
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..