Sed: Porovnání verzí

Smazaný obsah Přidaný obsah
Řádek 50:
=== Sed a proměnné ===
 
Sed jako takový s proměnnými nepracuje, ale používá zásobník tzv. ''buffer''. JakNicméně fungujepodobného siefektu můžetejako všimnout přije použití příkazu "x" (záměna), který provádí to, že přidá řádek do zásobníku a místo něj vyloží toproměnných colze vdosáhnout němpomocí zrovnaregulárních bylovýrazů.
 
<pre>
user@stroj:~/$ echo '(word 3336 556 3469 613 "790")' |sed '
s_\((word\) \([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\) \("[^"]*")\)_<\1><maxx>\2</maxx><minx>\4</minx><maxy>\3</maxy><miny>\5</miny><text>\6</text></\1>_g
# Ještě ořežu zbytky závorek
s_<(_<_g
s_</(_</_g
s_)<_<_g
# Následuje výsledek zpracování:'
<word><maxx>3336</maxx><minx>3469</minx><maxy>556</maxy><miny>613</miny><text>"790")</text></word>
</pre>
 
;Poznámka k příkladu : Někomu se může zdát uvedený příklad poněkud těžkopádný (mě teda osobně ano) a určitě jdou ty zbylé závorky ošetřit elegantnějším regulárním výrazem již při selektu - bohužel ještě nejsem natolik kovaný v této oblasti abych věděl jak.
Ačkoliv to na první pohled vypadá, že se výstup nijak nezměnil, není tomu tak. Poznáte to, když si pozorně porovnáte výstup s originálním souborem. Zatímco na začátku přibyl jeden prázdný řádek, na konci jeden naopak chybí. Proč?
 
=== Jak pracovat se zásobníkem ===
 
''Přiznám se, že práce se zásobníkem je pro mě dosud velice ztuha pochopitelná, pokusím se však přiblížit jeho fungování nejlépe jak budu umět.''
 
Jak už bylo zmíněno, ''sed'' nepracuje s vlastním řádkem, ale s ''prostorem pro vzorky'', ve kterém řádky zpracovává a teprve po jejich zpracování je vypouští ven. Je-li však toto výchozí chování potlačeno volbou "-n", tak se na výpisu zobrazí obsah ''prostoru pro vzorky'' jedině je-li odeslán příkazem '''p'''.
 
{| border="1" cellpadding="1" cellspacing="0" style="font-size: 75%; border: gray solid 1px; border-collapse: collapse; width: 100%"
|- style="background: #ececec;"
! Příkaz
! Příklad použití
! Popis
|-
| style="text-align:center" | '''p'''
|<pre><nowiki>
user@stroj:~/$ echo 'Zpracovávaný řádek' |sed '
p;s/Zpracovávaný/Upravený/'
Zpracovávaný řádek
Upravený řádek
</nowiki></pre>
| Příkaz vypisuje obsah ''prostoru pro vzorky''. V uvedeném příkladu byl příkazem '''p''' na standardní výstup vypsán obsah ''prostoru pro vzorky'' před jeho zpracováním.
|-
| style="text-align:center" | '''h'''
|<pre><nowiki>
user@stroj:~/$ echo 'Zpracovávaný řádek' |sed '
h;s/Zpracovávaný/Upravený/;g'
Zpracovávaný řádek
</nowiki></pre>
| příkaz odstraní původní obsah ''zásobníku'' a přesune místo něj do zásobníku obsah z ''prostoru pro vzorky''. Pro lepší demonstraci byl v příkladu použit také příkaz '''g''', ten nahradil upravený obsah ''prostoru pro vzorky'' obsahem ''zásobníku'', který, jak vidno, příkaz '''h''' přesunul do ''zásobníku'' ještě před jeho úpravou.
|-
| style="text-align:center" | '''H'''
|<pre><nowiki>
user@stroj:~/$ echo 'Zpracovávaný řádek' |sed '
H;s/Zpr/Upr/;H;s/acov/av/;H;s/áva/e/;H;g'
Zpracovávaný řádek
Upracovávaný řádek
Upravávaný řádek
Upravený řádek
</nowiki></pre>
| příkaz přidá k původnímu obsahu ''zásobníku'' obsah z ''prostoru pro vzorky''. Aby bylo lépe patrné jak je postupně obsah ''prostoru pro vzorky'' zpracováván, je průběžně přidáván příkazem '''H''' k obsahu ''zásobníku'' a na závěr vypsán příkazem '''g'''. První řádek nemá žádný obsah, protože ''zásobník'' byl původně prázdný.
|-
| style="text-align:center" | '''g'''
|<pre><nowiki>
user@stroj:~/$ echo 'Zpracovávaný řádek' |sed '
g'
 
user@stroj:~/$ echo 'Zpracovávaný řádek' |sed '
p;s/Zpracovávaný/Upravený/;g'
Zpracovávaný řádek
 
user@stroj:~/$ echo 'Zpracovávaný řádek' |sed '
p;s/Zpracovávaný/Upravený/;h;g'
Zpracovávaný řádek
Upravený řádek
</nowiki></pre>
| Příkaz vypíše obsah ''zásobníku'' a pak ho z něj odstraní. Jak funguje už sice docela objasnují příklady uvedené u předchozích příkladů, ale aby to bylo dostatečně zřejmé přidal jsem ještě další dva. V prvním příkaz '''g''' vypíše prázdný řádek, protože ''zásobník'' je zatím prázdný. Ve druhém příkladu příkaz '''p''' vypsal obsah ''prostoru pro vzorky'' aby bylo patrné že ten prázdný není. Teprve ve třetím příkladu je upravený obsah ''prostoru pro vzorky'' vložen příkazem ''h'' do ''zásobníku'', odkud může být příkazem '''g''' vypsán.
|-
| style="text-align:center" | '''G'''
|<pre><nowiki>
user@stroj:~/$ echo 'Zpracovávaný řádek' |sed '
G'
Zpracovávaný řádek
 
user@stroj:~/$ echo 'Zpracovávaný řádek' |sed '
p;s/Zpracovávaný/Upravený/;G'
Zpracovávaný řádek
Upravený řádek
 
user@stroj:~/$ echo 'Zpracovávaný řádek' |sed '
p;s/Zpracovávaný/Upravený/;h;G'
Zpracovávaný řádek
Upravený řádek
Upravený řádek
</nowiki></pre>
| Příkaz připojí obsah ''prostoru pro vzorky'' k obsahu ''zásobníku'', ten pak vypíše.
|-
| style="text-align:center" | '''x'''
|<pre><nowiki>
user@stroj:~/$ echo 'Zpracovávaný řádek' |sed '
x'
 
user@stroj:~/$ echo 'Zpracovávaný řádek' |sed '
p;s/Zpracovávaný/Upravený/;x'
Zpracovávaný řádek
 
user@stroj:~/$ echo 'Zpracovávaný řádek' |sed '
p;s/Zpracovávaný/Upravený/;h;x'
Zpracovávaný řádek
Upravený řádek
</nowiki></pre>
| Příkaz prohodí obsah ''zásobníku'', s obsahem ''prostoru pro vzorky''.
|-
|}
 
První řádek je prázdný proto, že při spuštění příkazu byl zásobník prázdný, takže řádek co se do něj vložil je nahrazen prázdným řádkem. A poslední schází protože nebyl ze zásobníku vypsán.
 
<pre>