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:
startsed příkaz '/start/,/stop/d' smaže pouze první dvě řádky.
stop start
stop
/RE1/,/RE2/ # pokud se /RE2/ nenajde, splňuje od /RE1/ do konce souboru(Je to stream editor - nedívá se "dopředu" do 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.
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'