Zázraky ihned, nemožné na počkání: sed - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Jaký fotograf/ka získal/a cenu za nejpopulárnější příspěvek v Nikon Photo Contest?

V dnešní soutěži hrajeme o:

Seriály

Více seriálů



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

  1. načte řádek do paměti;
  2. 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;
  3. 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):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Software  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Zatím nebyl uložen žádný příspěvek, buďte první.

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: