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''. Jak funguje si můžete všimnout při 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ží to co v něm zrovna bylo.
 
Jak funguje si můžete všimnout při použití příkazu "x" (záměna)
 
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č?
 
První řádek je prázdný proto, že při spuštění příkazu byl bufferzá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,protože ženebyl zůstalze vzásobníku bufferuvypsán.
 
<pre>
#!/bin/bash
# grep3 - vrátí na výstupu tři řádky, řádek s hledaným vzorkem a řádek před a za
case $# in
1);;
*) echo "Použití: $0 vzorek";exit;;
esac;
 
# Parametr "-n" zajistí aby se vypisoval pouze zpracovaný výstup
sed -n '
'/$1/' !{
# protože je uveden znak "!", který neguje sadu příkazů ve složených závorkách
# tak výsledkem příkazu je, že je do zásobníku vložen obsah řádku, který NEOBSAHUJE vyhovující vzorek
# a nahradí tak jeho původní obsah
x
# a odstraněna "karta" která byla v zásobníku zrovna nahoře
d
}
# v tuto chvíli čeká v zásobníku na svou příležitost řádek co nevyhovoval. Protože řádek neprošel předchozí
# sadou příkazů, nebyl odstraněn..
'/$1/' {
# ..je vypsán na standardní výstup a místo něj je na spodek "balíčku" umístěn vyhovující řádek...
x
# ...a vzápětí rovněž vypsán,..
p
# ...protože bude nahrazen dalším řádkem, pokud také podmínce vyhoví
x
# ...takže ho raději hned vypíšeme...
p
# ...a poskočíme při zpracování rovnou na další řádek
n
# ...který také vypíšeme, pro případ že by nevyhověl podmínce
p
# a aby to bylo přehlednější, přidáme pro jistotu řádek s oddělovacími znaky
a\
---
# ..a vyčistíme zásobník, tím že do něj přidáme prázdný řádek
x
}'
</pre>