sed - dávkový neinteraktivní řádkový editor v4.0.x

sed se používá k neinteraktivní změně souborů nebo vstupu[ů] z roury. Je v některých ohledech podobný editorům, které umožňují editovací scripty (jako např. ed); sed však provádí pouze jeden průchod přes vstupní soubor[y] a tak je efektivnější. Hlavní rozdíl od těchto editorů je však možnost filtrovat/upravovat text i v rourách. Nejčastěji se sed používá k náhradě řetězců, ale lze v něm provádět daleko komplexnější věci. Ačkoliv by se tyto změny nechaly provést i pomocí programů awknebo perl, je sed rychlejší, rychleji startuje a řadu úkonů v něm lze zapsat jednoduššeji.

Poznámky:

Užití: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

  -n, --quiet, --silent
                 potlačí automatický výstup oblasti vzorku
  -e script, --expression=script
                 přidá daný script k příkazům, jež se budou provádět
  -f script-file, --file=script-file
                 přidá obsah souboru k příkazům, jež se budou provádět
  -i[suffix], --in-place[=suffix]
                 editace souborů "v místě", záloha pokud specifikována přípona
  -r, --regexp-extended
                 ve scriptech použity rozšířené regulární výrazy
  -u, --unbuffered
                 načítá minimální množství dat ze vstupních souborů a častěji vyprazdňuje výstupní buffery
  -s, --separate
                 nebere soubory jako jeden spojitý dlouhý proud, ale jako oddělené
  -l N, --line-length=N
                 určuje délku pro požadované lámání řádek v příkazu "l"
Pokud není zadána žádná z voleb -e, --expression, -f, nebo --file, pak je první argument, který není volbou, brán jako sed script, který se má provést. Všechny zbývající argumenty jsou jména vstupních souborů; pokud nejsou vstupní soubor[y] specifikované nebo je zadán znak "-", je čten standardní vstup.

Funkce programu
Sed program (také jej nazýváme script) sestává z jednoho nebo více sed příkazů vložených jednou nebo více volbami -e -f --expression --file nebo prvním argumentem který není volba, pokud nejsou volby užity. Každý sed příkaz sestává z volitelné adresy nebo rozsahu adres následované jednopísmenným jménem příkazu a případně pro příkaz specifickým kódem. Sedvezme souhrn editovacích příkazů a aplikuje postupně jak jdou za sebou každý příkaz na každou vstupní řádku. Po aplikování všech příkazů na první řádku vstupu je tato řádka vypsána. Stejně je zpracována druhá řádka a cykl se opakuje přes všechny vstupní řádky. Sed scripty mohou adresovat jednu řádku číslem řádku nebo splněním regulárního výrazu /RE vzorek/ na řádce. Vykřičník "!" za regulárním výrazem nebo číslem řádku způsobí výběr všech řádek, které nesplňují tuto adresu. Sed můze také adresovat rozsah řádek - zapíše se jako 2 adresy oddělené čárkou.

Sed pracuje s dvěma datovými buffery: aktivním "prostorem vzorků" a pomocným "paměťovým prostorem". Při "normálních" operacích sed čte po jedné řádce ze vstupního proudu a tu umisťuje do prostoru vzorků, kde se provádějí všechny manipulace s textem. Paměťový prostor je na počátku prázdný, ale je několik příkazů pro přesun dat mezi paměťovým prostorem a prostorem vzorků.

Přehled příkazů
Příkazy bez adresy:

: label - Návěští pro příkazy b a t.

#comment(cecy) - Komentář (do konce řádku nebo konce -e script části).

} - Uzavírací závorka { } bloku.

Příkazy bez nebo s jednou adresou:

= - Vypíše číslo aktuální řádky.

a \
text
- K prostoru vzorku přidá text, kde každé vložené nové řádce předchází zpětné lomítko.

i \
text
- Do prostoru vzorku vloží text, kde každé vložené nové řádce předchází zpětné lomítko.

q - Okamžitě ukončí sed skript bez zpracování dalších vstupů. Pokud není zakázán auto-print, tak je vypsán aktuální prostor vzorků.

Q - Okamžitě ukončí sed skript bez zpracování dalších vstupů.

r filename - Přidá text načtený ze souboru filename.

R filename - Přidá řádku načtenou ze souboru filename.

Příkazy, jež akceptují rozsahy adres
{ - Začíná blok příkazů (je ukončen } ). Tak může být několik příkazů aplikováno na řádku nebo řádky splňující rozsah adres. Na příkazové řádce musí každý příkaz ukončovat středník, který musí být i před uzavírací složenou závorkou.
Příklad:
sed '/Vlastník:/{s/vaše/naše/g;s/tvůj/můj/g;s/vy/my/g;}' file

b label - Skok na návěští label; pokud návěští chybí, skok na konec scriptu.

t label - jestliže příkaz s/// provedl úspěšně substituci od doby načtení poslední vstupní řádky a od posledního t nebo T příkazu, pak se skočí na návěští label; pokud je návěští vynecháno, skočí se na konec scriptu.

t label - jestliže žádný příkaz s/// neprovedl úspěšně substituci od doby načtení poslední vstupní řádky a od posledního t nebo T příkazu, pak se skočí na návěští label; pokud je návěští vynecháno, skočí se na konec scriptu.

c \
text
- Nahradí vybrané řádky textem text, kde vloženým znakům LF-nová řádka předchází znak zpětné lomítko.

d - Výmaz prostoru vzorků a začátek nového cyklu.

D - Výmaz v prostoru vzorků až k prvnímu vloženému znaku LF (nová řádka). Začátek nového cyklu, ale čtení ze vstupu se přeskočí pokud v prostoru vzorků ještě zůstanou nějaká data.

h H - Kopírování/přidání prostoru vzorků do paměťového prostoru.

g G - Kopírování/přidání paměťového prostoru do prostoru vzorků.

x - Výměna obsahu paměťového prostoru a prostoru vzorků.

l - Výpis aktuální řádky ve ``vizuálně jednoznačné'' formě.

n N - Čte/přidá následující řádku do prostoru vzorku. Je nutné vědět, že pokud použijeme N k zřetězení řádek /např. pro test koncového výrazu/, může mít prostor vzorku mnoho řádek spojených posloupností "\n" označující konce řádek do jednoho vzorku. Regulární výrazy na vzorku pracující pak může být nutno modifikovat, např. užít '/\nStart/' místo '/^Start/' a '/[^\n]*/' místo '/.*/' a některé sed příkazy nemusí být proveditelné.

p - Vypíše současný prostor vzorků.

P - Výpis prostoru vzorků až k první vložené nové řádce.

s/regexp/náhrada/ - jestliže prostor vzorku splňuje regexp, nahradí splňující část. "náhrada" může obsahovat speciální znak & odkazující na splňující část, a speciální posloupnosti \1 až \9 odkazující na odpovídající splňující podvýrazy.

w filename - Zapíše současný prostor vzorků do souboru filename.

W filename - Zapíše první řádku současného prostoru vzorků do souboru filename.

y/source/dest/ - Přeloží znaky prostoru vzorků které se vyskytují v source na odpovídající znaky v dest.

Adresy
Příkazy sed mohou být zadány:
- bez adres; pak bude příkaz prováděn pro všechny vstupní řádky
- s jednou adresou; pak bude příkaz prováděn pouze pro vstupní řádky splňující tuto adresu
- s dvěma adresami; pak bude příkaz prováděn pro vstupní řádky splňující spojitý rozsah řádek od první adresy do poslední adresy včetně. Poznamenejme, že syntaxe rozsahu adres je adr1,adr2 (tj. adresy jsou oddělené čárkou); řádka splňující adr1 bude vždy vybrána, i když adr2specifikuje dřívější řádku; a pokud je adr2 regulární výraz (regexp), nebude testován oproti řádce kterou splňuje adr1. Tzn., že rozsah normálně odpovídá 2 nebo více řádkům, s výjimkou kdy první adresu splňuje poslední řádka souboru nebo pokud se adr2 vyskytne pouze před adr1. Rozsah vždy odpovídá celým řádkům, ne pouze části řádek. Dále - rozsah je mimimalistický, tj. rozsah "/jedna/,/dva/" zastaví na prvním nalezeném "dva" za řádkou s "jedna". Pokud se slovo "dva" vyskytne na více řádcích pod slovem "jedna", roszah budou splňovat všechny řádky od prvního "jedna" do prvního "dva". (Rozsah adres není "hladový", jako u regulárních výrazů.) Rozsah adres se snaží splňovat více než jeden blok řádek v souboru, ale bloky se nesmí překrývat. Navíc druhý splňující nesmí "brát" poslední řádku předchozího bloku. Např. v následujícím textu:

      start
stop start
stop
sed příkaz '/start/,/stop/d' smaže pouze první dvě řádky.
Jestliže rozsah nalezne řádku splňující "adr1", ale nenalezne "adr2", pak budou splňovat všechny řádky od "adr1" do konce souboru, tj. viz:
  /RE1/,/RE2/  # pokud se /RE2/ nenajde, splňuje od /RE1/ do konce souboru


20,/RE/ # pokud se /RE/ nenajde, splňuje od řádky 20 do konce souboru

/RE/,30 # pokud se /RE/ vyskytne kdekoliv po řádce 30, každý výskyt
# bude splňovat.
(Je to stream editor - nedívá se "dopředu" do souboru.)

Po adrese (nebo rozsahu adres) a před příkazem může být vložen znak"!", který specifikuje že příkaz bude prováděn pouze pokud adresa (nebo rozsah adres) nesplňuje.

Jsou podporovány následující typy adres:
číslo - Splňuje pouze zadané číslo řádky
první~krok - Splňuje každá krok-tá řádka počínaje řádkouprvní. Např. "sed -n 1~2p" vypíše všechny liché řádky vstupního proudu, a např. adresu 2~5 bude splňovat každá pátá řádka počínaje druhou (GNU rozšíření)
$ - Splňuje poslední řádka
/regexp/ - Splňují řádky splňující regulární výraz regexp
\cregexpc - Splňují řádky splňující regulární výraz regexp. "c" může být jakýkoliv znak.

GNU sed také podporuje některé speciální dvouadresové tvary:
0,addr2 - rozdíl od 1,addr2 je ten, že pokud addr2 splňuje první řádku vstupu, tak tato forma bude na konci rozsahu, zatímco tvar 1,addr2 by byl na jeho začátku.
addr1,+N - bude splňovat addr1 a N řádek ji následujících.
addr1,~N - bude splňovat addr1 a řádky jí následující až do řádky jejíž pořadové číslo je násobek N.

Regulární výrazy
POSIX.2 BRE (=Basic Regular Expressions - Základní regulární výrazy) by měly být podporovány, ale možná ne úplně - důvodem je výkon programu.
Posloupnost \n je regulární výraz který splňuje znak "nová řádka". Podobně to platí pro znaky \a, \t a další.

Příklady

$d               # výmaz poslední řádky souboru

/[0-9]\{3\}/p # tisk řádek, na kterých jsou 3 za sebou jdoucí číslice
5!s/ham/fuj/ # s výjimkou řádku 5 vyměň 'ham' za 'fuj'
/awk/!s/aaa/bb/ # pokud není nalezen řetězec 'awk', nahraď řetězec 'aaa' řetězcem 'bb'
17,/foo/d # výmaz řádek od řádky 17 do řádky na níž je řetězec 'foo'



Poslední aktualizace: 31.3.2004 Fr. Hanzlík