A sed működési elve

A fenti gyors szintaktikai összefoglaló után lássuk, hogyan is működik a sed. A legfontosabb, hogy a sed (a később ismertetendő kivételektől eltekintve) mindig egyszerre egy sorral dolgozik! A sed a feldolgozandó fájl(ok) sorait egyenként olvassa be, s a beolvasott sor az ún. pattern space-be (mintatérbe) kerül. A sed ezután a mintatér tartalmán hajtja végre egymás után a scriptben szereplő parancsokat. A dőlt betűs megadás nem volt véletlen: a sed működéséből fakadóan a mintatér(be beolvasott) sor tartalmát a végrehajtott parancsok módosítják, így a legtöbb sed parancs már nem az eredeti beolvasott soron, hanem az előző parancs által már módosított soron hajtódik végre. Ha a scriptben szereplő összes parancs feldolgozta a mintatérben lévő sort, a mintatér tartalma kikerül a standard outputra (a -n opcióval ezt a default kiírást tilthatjuk le). A mintatér kiürítése után a sed beolvassa a következő sort a bemenetről a mintatérbe, s azon megint csak sorra végrehajtódnak a scriptben szereplő parancsok. A sed működését tehát az alábbi egymásba ágyazott ciklussal szemléltethetnénk:

for sor in ( fájl ); do

sor a mintatérbe kerül

for parancs in ( script ); do

parancs végrehajtódik a mintatér tartalmán

done

mintatér tartalma a standard kimenetre kerül

done

Nagyon figyeljünk arra, mert a legtöbb félreértést ez szokta okozni, hogy a "belső ciklusban" mindig a parancsok végrehajtása szerepel, azaz a sed a sorokat egyenként olvassa be, és a mintatérben éppen bennlevő soron hajtja végre egymás után a scriptben szereplő összes parancsot, nem pedig fordítva, a teljes fájlon egymás után a script egyes parancsait! A következő példa talán megvilágítja a problémát:

Ha egy fájlunkat feldolgozva az alma szót körtére, a körtét pedig barackra szeretnénk változtatni, akkor "reflexszerűen" valami hasonlót írnánk a scriptbe:

 

s/alma/korte/

s/korte/barack/

Futtatás után "keserű kudarc lesz osztályrészünk": miután egymás után mindkét parancs végrehajtódik az éppen beolvasott soron, ha abban szerepelt az alma szó, akkor ezt várakozásunknak megfelelően átírja körtére, ez a minta viszont a következő behelyettesítő parancsnak fog megtetszeni, s az a mintatérben nyomban továbbalakítja a körtét barackká, általunk nem kívánt uniformizálást hajtva végre gyümölcsállományunkon... A helyes megoldás a sed belső lelkivilágát figyelembe véve a két parancs megfordítása, azaz a

 

s/korte/barack/

s/alma/korte/

script használata.

 

Tartalomjegyzék