Sed: Porovnání verzí

Smazaný obsah Přidaný obsah
JAnDbot (diskuse | příspěvky)
m řádková verze {{Wikiknihy}} do odkazů; kosmetické úpravy
m typograficky poupraveno
Řádek 1:
{{DISPLAYTITLE:sed}}
{{Různé významy|tento=počítačovém programu}}
<tt>'''sed'''</tt> (zkratka pro '''''s'''tream '''ed'''itor'') je jednoduchý, ale výkonný [[počítačový program]], sloužící k &nbsp;aplikaci rozličných předdefinovaných textových transformací na sekvenční proud textových dat. Po jednotlivých řádcích prochází vstupní soubor, dle pravidel určených v &nbsp;jednoduchém jazyku (sedovském skriptu) každý řádek upraví a &nbsp;poté vypíše. Sed původně vytvořil někdy na přelomu let [[1973]]/[[1974]] [[Lee E. McMahon|Lee&nbsp;E. McMahon]] z &nbsp;[[Bellovy laboratoře|Bellových laboratoří]] jako [[Unix|unixový]] nástroj, dnes je však dostupný pro téměř všechny [[Operační systém|operační systémy]] podporující [[příkazový řádek]].
 
== Popis ==
Sed je často nazýván neinteraktivním textovým editorem. Od konvenčních textových editorů se odlišuje způsobem, jakým je vstup zpracováván. Místo toho, aby jednou prošel seznam příkazů a &nbsp;každý z &nbsp;nich aplikoval na celý text, uložený v &nbsp;[[elektronická paměť|paměti]] [[počítač]]e, prochází sed textovým souborem jednou a &nbsp;na každý řádek aplikuje seznam příkazů. Protože je v &nbsp;jednu chvíli v &nbsp;paměti jen jediný řádek, dokáže sed zpracovat i &nbsp;opravdu velké textové soubory.
 
Sedovské příkazy vychází z &nbsp;editoru [[Ed (editor)|ed]] a &nbsp;většina příkazů funguje podobně, avšak v &nbsp;obrácené formě. Například: příkaz '''25d''' znamená ''je-li toto řádek číslo 25, pak jej smaž (a &nbsp;nevypisuj)'', namísto ''jdi na řádek 25 a &nbsp;smaž ho'', jako tomu bylo v &nbsp;editoru ed. Důležitou výjimku tvoří příkazy pro kopírování a &nbsp;přesun, které zasahují do více řádků a &nbsp;nemají tedy v &nbsp;sedu přímý ekvivalent. Namísto nich přináší sed zvláštní [[vyrovnávací paměť]] (buffer) a &nbsp;dodatečné příkazy pro práci s &nbsp;ním. Například příkaz edu pro zkopírování řádku 25 na řádek 76 ('''25t76''') by byl v &nbsp;sedu proveden pomocí dvou příkazů ('''25h; 76g''') pro uložení řádku do bufferu až do chvíle, kdy bude znovu použit.
Sed je často nazýván neinteraktivním textovým editorem. Od konvenčních textových editorů se odlišuje způsobem, jakým je vstup zpracováván. Místo toho, aby jednou prošel seznam příkazů a každý z nich aplikoval na celý text, uložený v [[elektronická paměť|paměti]] [[počítač]]e, prochází sed textovým souborem jednou a na každý řádek aplikuje seznam příkazů. Protože je v jednu chvíli v paměti jen jediný řádek, dokáže sed zpracovat i opravdu velké textové soubory.
 
Sedovské příkazy vychází z editoru [[Ed (editor)|ed]] a většina příkazů funguje podobně, avšak v obrácené formě. Například: příkaz '''25d''' znamená ''je-li toto řádek číslo 25, pak jej smaž (a nevypisuj)'', namísto ''jdi na řádek 25 a smaž ho'', jako tomu bylo v editoru ed. Důležitou výjimku tvoří příkazy pro kopírování a přesun, které zasahují do více řádků a nemají tedy v sedu přímý ekvivalent. Namísto nich přináší sed zvláštní [[vyrovnávací paměť]] (buffer) a dodatečné příkazy pro práci s ním. Například příkaz edu pro zkopírování řádku 25 na řádek 76 ('''25t76''') by byl v sedu proveden pomocí dvou příkazů ('''25h; 76g''') pro uložení řádku do bufferu až do chvíle, kdy bude znovu použit.
 
Následující příklad ukazuje typické využití sedu:
Řádek 13 ⟶ 12:
sed -e 's/původní/nový/g' vstupniSoubor > vystupniSoubor
 
'''s''' znamená nahraď (substitute), '''g''' znamená globálně, tj. každý vyhovující výskyt na řádku bude nahrazen. Za prvním lomítkem začíná [[regulární výraz]] pro vyhledání. Za druhým lomítkem je výraz pro jeho nahrazení. Příkaz náhrady ('''s///''') je nejsilnější a &nbsp;nejpoužívanější sedovský příkaz.
 
V &nbsp;systémech unixového typu je sed často využíván jako filtr v &nbsp;rouře:
 
generuj_data | sed -e 's/x/y/'
 
Na vytvořená data je aplikován malá změna, spočívající v &nbsp;náhradě ''x'' za ''y''.
 
Více nahrazení či jiných příkazů lze uložit například do souboru ''nahrada.sed'' a &nbsp;poté použít:
 
sed -f nahrada.sed vstupniSoubor > vystupniSoubor
 
Vedle nahrazování jsou možné i &nbsp;další jednoduché úpravy. Následující skript kupříkladu smaže prázdné řádky nebo řádky obsahující jen mezery:
 
sed -e '/^ *$/d' vstupniSoubor
 
V &nbsp;příkladu je použito následujících metaznaků:
 
* ^ vyhovuje začátku řádku
Řádek 37 ⟶ 36:
* [] vyhovuje kterémukoli ze znaků uvedených v []
 
Komplexní konstrukce jsou v &nbsp;sedu možné do té míry, že jej lze považovat za vysoce specializovaný, třebaže jednoduchý, [[programovací jazyk]]. Tok programu lze například řídit použitím návěstí (dvojtečka následovaná řetězcem, tj. názvem návěstí) a &nbsp;instrukce '''b'''; instrukce '''b''', následovaná názvem návěstí přesune zpracovávání do bloku za návěstím. Pokud návěstí neexistuje, pak dojde k &nbsp;ukončení skriptu.
 
Sed je jedním z &nbsp;nejstarších unixových nástrojů, umožňujících zpracování datových souborů z &nbsp;příkazového řádku. Stal se z &nbsp;něj přirozený nástupce populárního příkazu [[grep]]. Jako bratranec pozdějšího [[AWK]] umožnil sed provádění zajímavých a &nbsp;mocných datových úprav v &nbsp;kombinaci s &nbsp;[[Shell (programování)|shellovými]] skripty. sed byl také jedním z &nbsp;prvních unixových nástrojů, který skutečně vybízel k &nbsp;všestrannému využití regulárních výrazů. Co se týče rychlosti operací je sed obecně rychlejší než [[Perl]] a &nbsp;podstatně rychlejší než AWK.
 
Sed a &nbsp;AWK jsou často prohlašovány za předchůdce a &nbsp;inspirativní zdroje pro jazyk Perl; konkrétně příkaz '''s///''' je součástí perlovské syntaxe.
 
Jazyk sedu nemá proměnné a &nbsp;má pouze primitivní ''goto'' a &nbsp;schopnost větvení. Přesto je však [[turingovská úplnost|turingovsky úplný]].
 
[[GNU]] sed přináší několik nových funkcí, jako je okamžitá editace souborů (tj. nahrazení původního souboru výsledkem aplikace sedovského programu). Okamžité editace se často využívá namísto skriptů ed, např.:
Řádek 56 ⟶ 55:
q
 
Také existuje rozšířená verze sedu, nazvaná ''Super-sed'' ([[ssed]]), zahrnující regulární výrazy kompatibilní s &nbsp;Perlem.
 
== Ukázka kódu ==
Přestože sed obvykle pracuje s &nbsp;jedním řádkem, následující příklad odebere znak nového řádku z &nbsp;věty tam, kde následující řádek začíná mezerou.
 
Přestože sed obvykle pracuje s jedním řádkem, následující příklad odebere znak nového řádku z věty tam, kde následující řádek začíná mezerou.
 
Mějme následující text:
Řádek 69 ⟶ 67:
můj pes se jmenuje Frank
 
A &nbsp;tady je příkaz:
 
sed 'N;s/\n //g;P;D;'
Řádek 85 ⟶ 83:
 
== Literatura ==
* ''awk &nbsp;& sed: Příručka pro dávkové zpracování textu'', Helmut Herold, [http://cpress.cz Computer Press], ISBN 80-251-0309-9, [[2004]]
 
* ''awk & sed: Příručka pro dávkové zpracování textu'', Helmut Herold, [http://cpress.cz Computer Press], ISBN 80-251-0309-9, [[2004]]
 
== Externí odkazy ==
* {{Wikiknihy|kniha=sed}}
* [http://www.cs.hmc.edu/qref/sed.html Velmi stručný úvod]
* [http://sed.sourceforge.net Hlavní zdroje sedovských skriptů a &nbsp;souborů]
* [http://sed.sourceforge.net/sedfaq.html Často kladené otázky (FAQ)]
* [http://sed.sourceforge.net/sed1line.txt Užitečné sedovské skripty online]
* [http://sed.sourceforge.net/sed1line_cz.html Užitečné sedovské skripty online - česky]
* [http://www.pement.org/sed/ Domovská stránka s &nbsp;částečným zaměřením na Windows/DOS]
* [http://sed.sourceforge.net/grabbag/scripts/turing.txt Článek popisující implementaci Turingova stroje v &nbsp;sedu]
* [http://sed.sourceforge.net/grabbag/scripts/turing.sed Implementace Turingova stroje v &nbsp;sedu, aktuální skript]
* [http://www.gnu.org/directory/text/editors/super-sed.html Super-sed]
* [http://aurelio.net/sed/sokoban/ Hra Sokoban, napsaná v sedu]