21.
Sed
1. Úvod
„Sed“ je nástroj příkazové řádky pro editaci textového souboru (txt či txtz) po záznamech. Nejčastěji je užíván díky své schopnosti testovat záznamy vůči regulárním výrazům a nahrazovat jejich shody. Ve skutečnosti nenabízí o mnoho víc, takže tato kapitola bude spíše stručná. Jeho hlavními výhodami oproti konkurečním nástrojům jsou rychlost zpracování, přítomnost v prakticky každé instalaci linuxu, stoprocentní podpora UTF-8 a mimořádně úsporná syntaxe.
Sed pracuje tak, že v cyklu načítá záznamy ze vstupních souborů a na každý záznam spustí skript (zadaný typicky přímo na příkazové řádce, jen vzácně se ukládá do samostatného souboru).
GNU Sed je vyvíjen v rámci projektu GNU.
2. Definice
- Prostor (space) je v Sedu oblast, do které se ukládají textové záznamy nebo jiné hodnoty. Existují pouze pevně definované prostory.
- Pracovní prostor (pattern space) je prostor, do kterého se normálně na začátku každého cyklu přiřadí další načtený záznam. (Může však obsahovat i více záznamů.) Existují dva způsoby, jak na pracovní prostor nahlížet: většina příkazů ho vidí jako uspořádaný seznam záznamů, kde každý záznam je uveden včetně svého ukončovače; tzn. např. „ab\n“ a „cd\n“. Výjimkou je příkaz „s“, který vidí pracovní prostor jako řetězec, kde jsou tyto záznamy spojeny dohromady, ovšem ukončovač posledního záznamu je odsunut mimo. (Proto jsou-li např. v pracovním prostoru dva výše uvedené záznamy, příkaz „s/.*//“ skončí stejně vypsáním jedné prázdné řádky, protože závěrečný ukončovač zůstává mimo dosah příkazu „s“.)
- Paměť (hold space) je pomocný prostor, do kterého lze záznamy z pracovního prostoru přenést či je tam připojit.
- Příznak je booleovská proměnná používaná k podmíněným skokům (viz příkazy „s“, „t“ a „T“).
- Vstupní data sed rozdělí na záznamy, což jsou ve výchozím stavu řádky (ukončené znakem „\n“), ale s parametrem „-z“ to budou bloky znaků ukončené nulovým bajtem („\0“).
- Počítadlo záznamů je číselná proměnná – na počátku má hodnotu 0 a inkrementuje se pokaždé, když je ze vstupu načten záznam (tzn. pro první záznam už má hodnotu 1). Nikdy se nenuluje.
2/1 Cyklus sedu
Sed provádí zpracování vstupních souborů v těchto krocích:
1) Smaž pracovní prostor.
2) Pokud je na vstupu další záznam, načti ho a připoj na konec pracovního prostoru; jinak skonči.
3) Procházej skript, vyhodnocuj podmínky a vykonávavej odpovídající příkazy.
4) Vypiš pracovní prostor včetně odděleného ukončovače záznamu. (Tento krok se často z postupu odstraňuje voláním sedu s parametrem „-n“. Rovněž příkaz „d“ ho potlačí.)
5) Pokud nebyl v tomto cyklu skriptu proveden příkaz „q“, jdi zpět na krok 1.
2/2 Obecný tvar příkazu
Příkazy sedu mají obecný tvar:
Vykřičník neguje logickou hodnotu podmínky.
Je-li příkazů víc, odděluje je konec řádky („\n“), není-li odzvláštněn zpětným lomítkem. Pokud neposlední z příkazů neočekává jako parametr název souboru či obecný text, lze je oddělit také středníkem.
Místo jednotlivého příkazu může být také blok příkazů, které pak mohou mít svoje vlastní podmínky. V takovém případě sed nejprve otestuje podmínku bloku; není-li splněna, celý blok se přeskočí. Je-li splněna, sed do bloku vstoupí a jeho obsah vykoná, jako by podmíněn nebyl. Bloky lze zanořovat. Příklad, jak může vypadat blok:
2/3 Řetězec náhrady
V příkazu „s“ se uvádí „řetězec náhrady“, tedy řetězec, který definuje, za co se mají nahradit shody uvedeného regulárního výrazu. V tomto řetězci mají zvláštní význam znaky „\“, „&“ a znak ohraničující daný regulární výraz (obvykle „/“ či „!“); všechny lze odzvláštnit zpětným lomítkem.
Zvláštní významy znaků jsou následující: Za znak „&“ se dosadí původní text celé shody; za kombinace „\1“ až „\9“ se dosadí text podshody první až deváté skupiny v regulárním výrazu (skupiny se číslují podle pozice otevírací závorky). Za „\n“ se dosadí znak konce řádku, pro vložení nulového bajtu použije kombinaci „\x00“.
V řetězci náhrady také mohou být přepínače konverze velikosti písmen: „\L“ konvertuje následující znaky na malá písmena, „\U“ na velká písmena a „\E“ tuto konverzi vypne. „\l“ a „\u“ fungují analogicky, ale uplatní se jen na jeden následující znak.
3. Zaklínadla
3/1 Podmínky (uvádějí se před příkaz)
Kteroukoliv podmínku lze negovat uvedením vykřičníku za podmínku.
4. Zaklínadla: Příkazy
4/1 Operace s pracovním prostorem
4/2 Skoky
4/3 Výpis na výstup
4/4 Operace s pamětí
4/5 Komentář
5. Parametry příkazů
5/1 sed
☐ -E | Použije rozšířené regulární výrazy místo základních. (Tento parametr doporučuji důsledně používat, kdykoliv ve skriptu hodláte použít regulární výraz!) |
☐ -n | Odstranit z cyklu automatické vypisování pracovního prostoru. |
☐ -z | Záznamy jsou ukončeny „\0“ místo „\n“. |
☐ -i | Místo vypsání na výstup přepíše výstupem vstupní soubor. |
☐ --debug | Na výstup vypíše čitelné ladicí informace o činnosti skriptu. |
☐ -u | Ze vstupu načítá jen minimální množství dat. |
6. Instalace na Ubuntu
GNU sed je základní součástí Ubuntu přítomnou i v minimální instalaci.
7. Ukázka
8. Tipy a zkušenosti
- Programovat v sedu cokoliv složitějšího je namáhavé, nepraktické a náchylné na chyby. Pokud vám nestačí jen několik základních příkazů, je mnohem rozumnější použití složitějších nástrojů jako „GNU awk“ či „Perl“.
- Skripty v sedu dovedou být extrémně nesrozumitelné. Dovedli byste na příklad říci, co udělá „sed -E '\!testy!I!s!s!x\!!i'“?
- Malé textové soubory je často výhodné zpracovat najednou zadáním parametru „-z“. Když vstupní soubor neobsahuje nulový bajt, sed v takovém případě načte celý soubor jako jeden záznam.
9. Další zdroje informací
- Wikipedie: Sed
- HEROLD, Helmut. Awk & sed: příručka pro dávkové zpracování textu. Brno: Computer Press, 2004. ISBN 80-251-0309-9.
- Sally: Dávkový editor Sed
- Oficiální manuál (anglicky)
- An Introduction and Tutorial by Bruce Barnett (anglicky)
- YouTube: Understanding How Sed Works (anglicky)
- The Sed $HOME (anglicky)
- Computer Hope: Linux sed Command Help and Examples (anglicky)
- Oficiální stránka GNU sed (anglicky)
- Balíček (anglicky)
- TL;DR: sed (anglicky)
10. Zákulisí kapitoly
V této verzi kapitoly chybí:
- nic
Tato kapitola záměrně nepokrývá:
- nic