Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Software
Zázraky ihned, nemožné na počkání: sed
3. ledna 2002, 00.00 | Dnes si ukážeme nesmírně silný prostředek unixové příkazové řádky - dávkový editor sed. S jeho pomocí dokážeme sestavovat snadno takové editační skripty, pro které bychom jinak museli psát samostatné - a leckdy dost komplikované - aplikace
Dnes si ukážeme nesmírně silný prostředek unixové příkazové řádky — dávkový editor sed. S jeho pomocí dokážeme sestavovat snadno takové editační skripty, pro které bychom jinak museli psát samostatné — a leckdy dost komplikované — aplikace.Volání
Základní volání sedu je
sed -e příkaz ... < vstup > výstup
kde přepínačů -e a jim odpovídajících příkazů může být více. Pokud požadujeme složitější sadu příkazů, bývá pohodlnější je uložit do souboru, a podobně jako u příkazu grep předat sedu celý soubor pomocí přepínače -f:
sed -f soubor_s_příkazy < vstup > výstup
Namísto přesměrování standardního vstupu můžeme sedu také dát soubor nebo seznam souborů, ze kterých má svůj vstup číst. Příkaz sed nemá příliš mnoho přepínačů — jeho síla je v příkazech.
Ačkoli je to v našem výkladu běžné, stojí za to znovu zdůraznit, že zde nepopisujeme příkazy kompletně: budeme se zabývat jen dvěma nejběžnějšími příkazy sedu. Ten, kdo chce znát jeho plnou sílu, se může podívat na "man sed".
Základy
Příkaz sed čte vstup řádek po řádku. Postupuje v cyklu tak, že vždy
- načte řádek do paměti;
- postupně nad ním provede všechny příkazy v tom pořadí, v jakém jsou zapsány v souboru nebo na příkazovém řádku;
- po vyčerpání všech příkazů řádek (obvykle pomocí příkazů změněný) opíše na standardní výstup.
Tak pokračuje, dokud jsou na vstupu nějaké řádky. Speciálně to znamená, že kdybychom nezadali vůbec žádné příkazy, sed by prostě opsal vstup na standardní výstup.
Záměna znaků
Příkaz 'y' jednoduše zaměňuje znaky. Jeho základní tvar je
y/seznam1/seznam2/
a příkaz prostě zamění každý znak ze seznamu 1 odpovídajícím znakem ze seznamu 2:
31 /tmp> cat test
Jednoduchy testovaci text
pro ukazky prace s prikazem sed.
To je zatim vsechno...
32 /tmp> sed -e 'y/eai/EAI/' test
JEdnoduchy tEstovAcI tExt
pro ukAzky prAcE s prIkAzEm sEd.
To jE zAtIm vsEchno...
33 /tmp>
Můžeme ovšem používat i speciální znaky — takhle se třeba dá umístit každé slovo na zvláštní řádek:
33 /tmp> sed -e 'y/ /\n/' test
Jednoduchy
testovaci
text
pro
ukazky
prace
s
prikazem
sed.
To
je
zatim
vsechno...
34 /tmp>
Za zmínku stojí i to, že na místě oddělovačů '/' můžeme použít i jakýkoli jiný znak, chceme-li lomítko použít přímo uvnitř některého ze seznamů:
34 /tmp> echo "a/b:c~d" | sed -e 'y|/:~|,;:|'
a,b;c:d
35 /tmp>
Záměna textových řetězců
Plná síla sedu se však ukáže až u — na první pohled velmi podobného — příkazu 's'. Jeho základní tvar je
s/text1/text2/přepínače
Příkaz prostě zamění text1 řetězcem text2; pokud je pole přepínače prázdné, provede to jen pro první výskyt na řádku, přepínač 'g' vyžádá záměny všech výskytů:
35 /tmp> sed -e 's/ /[SPACE]/g' test
Jednoduchy[SPACE]testovaci[SPACE]text
pro[SPACE]ukazky[SPACE]prace[SPACE]s[SPACE]prikazem[SPACE]sed.
To[SPACE]je[SPACE]zatim[SPACE]vsechno...
36 /tmp>
Samozřejmě, že na místě lomítek může u příkazu 's' stát libovolný znak, stejně jako u příkazu 'y'. Podstatné však je to, že v text1 mohou být použity (základní) regulární výrazy, a text2 může obsahovat zpětné odkazy pro záměny — jednoduchým příkladem by mohlo být třeba
38 /tmp> sed -e 's/e\(.\)/["\1" za "e"]/g' test
J["d" za "e"]noduchy t["s" za "e"]tovaci t["x" za "e"]t
pro ukazky prac[" " za "e"]s prikaz["m" za "e"] s["d" za "e"].
To j[" " za "e"]zatim vs["c" za "e"]hno...
39 /tmp>
Příkazy ovšem můžeme libovolně kombinovat a navazovat na sebe. Následující příklad zároveň ilustruje jednu příjemnou specialitu sedu — znak '&' můžeme uvnitř řetězce text2 použít jako zástupce celého výrazu, odpovídajícího regulárnímu výrazu text1:
54 /tmp> sed -e 'y/eai/EAI/' -e 's/[A-Z]/(&)/g' -e 's/^(/[/' test
[J)(E)dnoduchy t(E)stov(A)c(I) t(E)xt
pro uk(A)zky pr(A)c(E) s pr(I)k(A)z(E)m s(E)d.
[T)o j(E) z(A)t(I)m vs(E)chno...
55 /tmp>
Mimochodem, ti, kdo mají raději kompaktnější zápis, mohou vkládat více příkazů i prostřednictvím jediného přepínače -e — stačí použít středník pro jejich oddělení. Minulý příkaz jsme tedy mohli stejně dobře zadat jako "sed -e 'y/eai/EAI/;s/[A-Z]/(&)/g;s/^(/[/' test".
To ale zdaleka není vše!
Ačkoli je asi zřejmé, že skládáním těchto příkazů s vhodně volenými regulárními výrazy dokážeme sestavit i velmi komplikované editační scripty, příkaz sed toho umí mnohem více: příště si ukážeme, jak je možné omezit působnost příkazů jen na některé řádky.
Obsah seriálu (více o seriálu):
- Obcování s ďáblem
- Obcování s ďáblem 2 - základy
- Obcování s ďáblem 3 - Práce se soubory
- Obcování s ďáblem 4 - Další práce se soubory
- Obcování s ďáblem 5 - Stále soubory, hlavně linky
- Obcování s ďáblem 6: Pár zbývajících drobností
- Obcování s ďáblem 7: Samá voda, přihořívá, hoří!
- Obcování s ďáblem 8: Jak se do shellu volá, tak se program ozývá
- Obcování s ďáblem 9: Nové finty na programy
- Obcování s ďáblem 10: Do fronty, pánové, do fronty!
- Obcování s ďáblem 11: Standardní vstup a výstup
- Obcování s ďáblem 13: Další triky
- Obcování s ďáblem 14: Vyšší škola hledání souborů
- Obcování s ďáblem 15: Příkaz find stokrát jinak
- Obcování s ďáblem 16: Co se ještě dá uvařit z příkazu find
- Obcování s ďáblem 17: Regulární výrazy
- Obcování s ďáblem 18: Speciální regulární výrazy
- Obcování s ďáblem 19: Skládání regulárních výrazů
- Obcování s ďáblem 20: Regulární výrazy se zpětnými odkazy
- Obcování s ďáblem 21:K čemu je dobrý grep...
- Zázraky ihned, nemožné na počkání: sed
- Obcování s ďáblem - další finty s příkazem sed
- Rozsáhlejší příklad se sedem
- Obcování s ďáblem: Další kouzla, aneb awk
- Awk a proměnné
- Obcování s ďáblem 27: Awk a výrazy
- Obcování s ďáblem: Awk a funkce
- Awk a příkazy
- Co je to vlastně "uživatel"?
- Vlastnictví objektů
- Přístupová práva
- Vlastník, skupina, ostatní...
- Jak je to se skupinami?
- Skupiny a uživatelé
- Scripty
- Komentáře, a volba shellu
- Pro skript může být shell cokoli!
- Shellové skripty a argumenty
- Skripty a proměnné: aritmetika
- Proměnné shellu, "dědění" hodnot
- Práce s proměnnými
- Práce se jmény souborů
- Pole hodnot
- Další triky kolem polí...
- Standardní proměnné shellu
- Základní příkazy pro skripty
- Příkaz if
- Speciální podmínkové příkazy
- Podmínky pro práci se soubory
- Jednoduchý cyklus
- Příkaz for a pomocné příkazy break a continue
- Příkaz case
- Příkazy exit a select
- Rejstřík a přehled
- Procesy
- Informace o procesech
- Další klíčová slova pro příkaz ps
- Příkaz ps: několik praktických přepínačů
- A k čemu že je "ps" dobré?
- Copak procesor, s pamětí je to horší
- Virtuální paměť
- A ještě jednou virtuální paměť
- Zpět k příkazu ps
- Skutečný žrout paměti
- Ještě jednou top
- Doplněk k topu: vm_stat
- Co to tedy všechno znamená?
- Nevychází nám dal a má dáti?
- Kam se stránky ukládají?
- Změna odkládacího disku
- Změna odkládacího disku / fstab
- Poslední poznámka k fstab
- A jak to je se soubory?
- Co vlastně příkaz lsof vypisuje?
- Příkaz lsof a obsah sloupce NAME
- SIPS - Terminál není jen pro nadšence UNIXu
- Tak nám zabili NetInfo, paní Müllerová