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.
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
<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>
|