You are on page 1of 14

UNIX-Linux/hjprogramozs - sed

A sed folyamszerkeszt
1.Bevezet............................................................................................................................................1
2.A sed parancssora..............................................................................................................................1
3.A sed mkdse.................................................................................................................................2
4.A sed parancsai..................................................................................................................................3
4.1.A cmek megadsa ....................................................................................................................3
4.2.Gyakran hasznlt parancsok......................................................................................................5
4.3.Ritkbban hasznlt parancsok....................................................................................................8
4.4.A hold pufferre vonatkoz parancsok........................................................................................9
5.Pldk a sed hasznlatra szkriptekben...........................................................................................10

1. Bevezet
A szvegfeldolgozssal kapcsolatos feladatok legfontosabb kvetelmnye a szvegek automatikus,
programbl vezrelt szerkesztse. Ezt a kvetelmnyt biztostja a sed nev szerkeszt, amelyik
"mfajban" a leginkbb hasznlt Unix parancs.
A sed egy specilis szvegszerkeszt, un. folyamszerkeszt program (stream editor). Ez azt jelenti,
hogy nem interaktv mdban szerkesztnk vele szveget, hanem a bemenetre vezetjk, a program
futs kzben vgigolvassa azt szvegsoronknt s kzben szerkesztsi mveleteket vgez rajta.

Az ilyen folyamot szerkeszt programok rendelkeznek egy parancsnyelvvel, amellyel meg lehet
adni nekik a szerkesztsi mveleteket. A nyelv segtsgvel a feldolgozs vezrlsre kis
szkripteket rhatunk, ezeket a sed esetben sed szkriptnek fogjuk nevezni.

A szerkesztett szveg fjlokba vagy egy kimeneti folyamba kerl tovbbi feldolgozsra. gy
szveges fjlok szerkesztsre vagy szrknt valamilyen szvegfeldolgozs kztes llomsaknt
hasznljuk.

Az albbiakban a GNU sed vltozatot ismertetjk rviden.

2. A sed parancssora
A sed meghvsnak ltalnos alakja:
sed [opcik] 'szkript' [bemeneti_fjlok]
A sed a vezrl szkriptet a -e vagy -f kapcsolkkal argumentumaknt kaphatja meg, illetve egy
karaktersor argumentumknt kapcsolk nlkl. A 'szkript' paramternek akkor kell szerepelnie,
ha sem a -e sem a -f kapcsolkkal nem adunk meg ms szkriptet.
A feldolgozott szveg vagy a standard bemenetre jn, vagy fjlnv argumentumknt: itt akr tbb
fjl is szerepelhet, a sed sorban fogja feldolgozni ket.
Az albbi hvsok teht mind helyesek:
a. az elso.txt nev fjl kerl a bemenetre, a sed szkript a -e kapcsol utn jn. A parancssoron
megadott szkripteket (az albbi pldban egyetlen p nev parancs aposztrfok kzt adjuk meg). A
parancssor:
$ sed -e 'p' elso.txt

1
UNIX-Linux/hjprogramozs - sed

b. ha nincs -e kapcsol, a sed az els paramterknt megadott sztringet tekinti szkriptnek:


$ sed 'p' elso.txt
A fenti pldkban a szerkesztett bemeneti fjl az elso.txt .
c. A sed a standard bemenetet olvassa, s a vgrehajt szkriptet az egyik elbb emltett mdon
adjuk meg:
$ cat elso.txt | sed 'p'
d. A sed szkript egy fjlban van, ilyenkor a fjl neve el a -f kapcsol kerl, a szkript fjl tpus
pedig .sed :
$ sed -f szerkeszt.sed elso.txt

Fontosabb kapcsolk:
-e szkript ezt a szkriptet is hozzfzi a vgrehajtandkhoz
-f szkript_file a szkriptet fjlbl veszi

-n nem r a kimenetre a mintatr (lsd kvetkez szekci) feldolgozsa utn


-r bvtett regulris kifejezseket hasznl
-i in place magt a fjlt szerkeszti
-s separate: ha tbb fjlt adunk meg, alaprtelmezsknt a fjlokat egyms
utn, egy folyamnak tekinti: -s esetben viszont kln kezeli ket.
A -i vel a -s -t is kell hasznlni.
-g minden helyettestsi parancsnl alkalmazza a g (global) opcit (lsd albb)

Ha kln fjlba rjuk a sed programot, annak els sorban a sed-et kell bejellni mint vgrehajt
program, teht a forrsnak gy kell kinzni:
#!/bin/sed -f
#itt soronknt jnnek sed parancsok:
1,2 p
3,$ d
, a -f kapcsol a vgrehajt programnak azt jelzi, hogy ezt a fjlt kell szkriptknt rtelmezni.

3. A sed mkdse
A sed mkds kzben kveti a vezrl szkriptben tallhat parancsokat. Egy sed szkript egy vagy
tbb egyms utni parancsbl ll. A sed szkriptben tallhat parancsok formtuma:
[cm] parancs [opcik]
gy ezek egy cmet, egy szerkeszt utastst s az utastshoz tartoz opcikat tartalmaznak,
ilyenszer feladatokat fogalmaznak meg: "cm : ha az els sor jn a folyambl, parancs: trld",
"cm : a msodik s harmadik sor kztti rszben, parancs: helyettestsd az a karaktert b -re".

A sed soronknt dolgozza fel a bemeneti szveget. Kt pufferel dolgozik, az egyiket mintatrnek
nevezi (pattern space), a msikat egy msodlagos trol puffernek (hold space). A kvetkez
algoritmust ismtli:

2
UNIX-Linux/hjprogramozs - sed

-Beolvas egy szvegsort levgja a vgrl az jsor karaktert s a sort a mintatrbe teszi.
-Ezutn lefuttatja a szkriptben lev parancsokat a mintatren: minden egyes parancsot ellenriz
(egyms utn), s csak azokat hajtja vgre, amelyeknek a cme illeszkedik a mintatrben lev sor
cmre (azrt hasznlhatjuk itt az illeszkeds fogalmat, mert a cmeket legtbbszr nem
sorszmokkal adjuk meg, mint pl. els s msodik sor, hanem pl. gy: azok a sorok amelyek
szmjeggyel kezddnek. Ezt pedig a legknnyebben regulris kifejezsekkel lehet kifejezni).
-Ha ezzel megvan, s nem adtunk meg -n kapcsolt, a mintatr tartalmt kirja a kimenetre, a sor
utn kirja a levgott jsor karaktert.
-Ha nem hasznlunk valamilyen specilis parancsot, ezek utn trli a mintateret
-Veszi a kvetkez sort s vgrehajtja ugyanazt
A sed egyszer olvassa vgig a bemeneti szveget, ha thaladt egy soron, oda mr nem tr vissza.

A sed vgrehajtsi mechanizmusa

A hold tr arra szolgl, hogy a mintatr trlse eltt specilis parancsokkal sorokat mozgassunk t
oda bonyolultabb feldolgozsok vgett. gy teht pufferelt feldolgozst is vgezhetnk: ezzel
egyelre nem foglalkozunk, a hold tr hasznlata felttelezi a sed egyszer mkdsnek j
elsajttst, ugyanakkor kis hjprogramokban nincs r felttlenl szksg.

4. A sed parancsai

4.1. A cmek megadsa


A cm meghatrozhat egy szveg sor cmet, egy tartomnyt, de kifejezhet valamilyen szvegben
tallhat mintt is. A feldolgozs sorn ezzel vlasszuk ki "mintateret", azokat a sorokat amelyeket
feldolgozunk. gy a cmeket az albbiak szerint lehet megadni:
n Egy szm, amely a feldolgozott szveg bizonyos sort cmzi, pl.:

3
UNIX-Linux/hjprogramozs - sed

22
a 22.-dik sort cmzi. A sorokat 1-tl szmozzuk.
$ A bemenet utols sort cmzi.
n~m Az n.-dik sortl m lpsknt cmzi a sorokat, pl:
1,3
minden harmadik sort cmez.
/regex/ Azokat a sorokat cmzi, amelyekben a regex regulris kifejezsre illeszthet
karakterlncot tall. Regulris kifejezs opci nlkl a sed alapszint regulris
kifejezseket hasznl, a -r kapcsolval pedig bvtetteket. Mi tbbnyire gy
fogjuk hasznlni. A kifejezst kt per jellel hatroljuk, pl.:
/^a/
cm azokra a sorokra vonatkozok amelyek kis a karakterrel kezddnek,
/[0-9]/
pedig azokra amelyekben van szmjegy.
Hatroljelknt a per jel helyett ms karaktert is lehet hasznlni, pldul a %
jelet, ez akkor hasznos ha a regulris kifejezsben van / . Ilyenkor az illet
karakter els elfordulst egy vissza-per jellel kell jelezni a GNU sed-ben, pl. az
albbi cm kivlassza azokat a sorokat amelyek per jellel kezddnek:
\%^/%
/regexp/I Az regulris kifejezs I mdostja kis-nagybet nlkli illesztst tesz lehetv.

cm1,cm2 A kt cm kzti tartomnyt cmzi:


10,15 a 10. s 15.-dik sor kzti tartomnyt
10,/^a/ a 10. s az utna kvetkez els olyan sor kzti rszt amely a-val
kezddik
Amennyiben a msodik cm kisebb mint az els, akkor csak egy sor a mintatr. Ha
a msodik cm nem tallhat meg a szerkesztett fjlban, akkor a sed az els cmtl
a fjl vgig szerkeszt.
nincs cm a Ha nincs a parancs eltt cm, akkor azt minden soron vgig kell hajtani.
parancs eltt

A cmek mindig teljes sorra vonatkoznak, s amennyiben cmhatrokra vonatkoznak, a hatrok is


beleesnek a cmzett tartomnyba, teht a 6,8 cm 3 sort jelent.
Ha regulris kifejezsekkel megadott tartomnyokkal dolgozunk, azok akr tbb cmteret is
kivlaszthatnak. Pl. az /^a/,/^b/ tartomny az els a betvel kezdd sortl a kvetkez b
betvel kezdd sorig vlassza ki a cmteret, s azon hajtja vgre a neki megfelel parancsot - ez
tbbszr elfordulhat a bemeneti sorokban.
Ha a sed nem kapja meg a tartomnyt zr sort (pl. az elbbi pldban nincs b-vel kezdd sor),
akkor a bemenet vgig mindent kivlaszt attl a sortl kezdve, amelyik a-val kezddik.

Mindez azrt van gy, mert a sed mkdse kzben nincs "elretekints", egyszer jrja vgig a
szveget (a vgrehajtsi sebessg miatt).

4
UNIX-Linux/hjprogramozs - sed

Fontos: Ebben a tananyagban minden regulris kifejezst bvtett extended


kifejezssel adunk meg, teht csak akkor mkdnek helyesen a sed-el val
feldolgozsban, ha a sed-et -r kapcsolval indtjuk.

4.2. Gyakran hasznlt parancsok


A sed parancsai egyms utn kvetkeznek kln szvegsorokban, amennyiben a sed szkript fjlban
van, vagy ; jellel elvlasztva, ha a szkript egy karakterlncban van a parancssoron.
Lssuk teht a sed leghasznltabb parancsait: egy felsorolsban adjuk meg ket, minden parancs
lersa utn pldkon keresztl.

A cmek utni ! jel esetben a parancsok a megadott cm komplementer


tartomnyra vonatkoznak.

# magyarzat (nincs eltte cm)


p Nyomtats (print)
Kinyomtatja a kimenetre mintatr tartalmt. A sed norml mdban minden
feldolgozsi ciklus utn automatikusan nyomtat. Ha -n kapcsolval
indtjuk, akkor nem nyomtat, s ilyenkor azokat a sorokat amelyeket mgis
nyomtatni akarunk ezzel a paranccsal kldjk a kimenetre. Pl. az albbi
parancs csak a harmadik sort fogja nyomtatni:
sed -n '3p' teszt.txt
az albbi pedig mindent sort, de a harmadikat ktszer:
sed '3p' teszt.txt
d Trls (delete)
Trli a mintatrbe kerlt sort vagy sorokat s j ciklusba kezd.
Pl.:
3d #trli a harmadik sort
3!d #trl minden sort, kivve a harmadikat
q Kilps (quit)
Kilp a sed, ha elri azt a sort, amelyre ez a parancs vonatkozik. Ilyenkor a
feldolgozs vget r.
s/regexp/csere/k Helyettests, csere (substitute): A legfontosabb parancsa a szerkesztnek,
A cmzett sorban a regexp -re illeszked karakterlncot a csere lncra
cserli. Pldul az albbi parancs a sorban tallhat els ab szekvencit xy-
ra cserli:

s/ab/xy/
$/s/^a/b/ az utols sor (cme a $ jel) elejn lev kis a karaktert b-re
cserli

A parancs kln metakarakterekkel rendelkezik, amelyeket a csere


sztringben hasznlhatunk, illetve a msodik / jel utn mdost kapcsolkat
adhatunk meg.

5
UNIX-Linux/hjprogramozs - sed

A csere sztringben az albbi metakaraktereket lehet hasznlni:

\n a regulris kifejezs n.-dik () -el kivlasztott rszlnct helyettesti. Pl:


\1 \2

& a teljes regexp ltal illesztett lncot helyettesti (gy a konkrt & karakter
bersra csere karakterlncba \& -et kell hasznlni)

A k kapcsol helyn az albbiak hasznlhatk:

g a regexp minden elfordulst helyettesti a feldolgozott sorban

n egy szm: csak az n.-dik elfordulst helyettesti

I kis-nagybet nem szmt a regexp illesztsnl

w fjl a csere utn az illet sort a fjl vgre rja. Indulskor a sed nullra
lltja a fjl hosszt. Ez arra j, ha csak bizonyos szerkesztett sorokat
akarunk egy fjlba kirni.

Pldk:

s/(ab).*/\1/ attl a ponttl kezdve, ahogy ab-t tall a sorban, az egsz


sort ab-re cserli.

s/ab/xy/2 a sorban tallhat msodik ab-t cserli xy-ra.

s/^.*$/x&x/ beilleszt a kivlasztott sor elejre s vgre egy kis x


karaktert: a kifejezs: ^.*$ a teljes sort kivlasztja: a csere sztring pedig
egy kis x, utna a kifejezssel kivlasztott rsz (az & gy a teljes sort jelenti)
utna ismt egy kis x.

s/[0-9]/x/2 a szerkesztett sorban elfordul 2.-dik szmjegyet kis x-el


helyettesti.

s/[0-9]/-/g a szerkesztett sorban elfordul sszes szmjegyet


ktjellel helyettesti.

1,3s/^[0-9]//w o.txt az elstl a 3.-dik sorig trl egy szmjegyet a


sor elejrl, s a szerkesztett sort (amellett, hogy elvgzi a sed belltott
kimenetre rst) kirja az o.txt fjlba - ezt a sed indtskor nullzza ha
ltezik.

cm {parancs1; Kapcsos zrjelet hasznlunk a sed parancsok csoportostsra: egy


parancs2; cmtartomnyhoz tbb parancsot tudunk gy rendelni, amelyek egyms utn
parancs3}
kerlnek meghvsra. Az albbi sed szkript veszi a mas -al kezdd sort,
elvgez benne egy helyettestst s kinyomtatja:

6
UNIX-Linux/hjprogramozs - sed

sed -n '/^mas/{ s/a/b/; p }'

Tovbbi pldk:
1. Trljk egy szvegbl az res sorokat:
$ cat test.txt | sed -r '/^$/d'

2. Cserljk ki a szvegben mindenhol a get szt put -ra:


$ cat test.txt | sed -r 's/get/put/'
A fenti mvelet a get sorozat minden elfordulst lecserli: ha azt akarjuk, hogy valban teljes
szavakat cserljen ki, akkor gy kell hasznljuk (megadjuk sz kt vgn a szhatrt):
$ cat test.txt | sed -r 's/\bget\b/put/'

3. Cserljk ki a California Hotel szprt Hotel California -ra :


$ echo 'Hotel California' | sed -r 's/(Hotel) (California)/\2 \
1/'
California Hotel
$

4. Vagy ltalnosabban, minden sorban cserljk fel az els kt szt:


$ echo 'elso masodik harmadik' | sed -r 's/^(\w+) (\w+)/\2 \1/'
masodik elso harmadik
$

5. Minden C fjlban cserljk ki az elso_fuggveny azonostt masodik_fuggveny -re:


$ sed -is -e 's/\belso_fuggveny\b/masodik_fuggveny/' *.c
$

Ebben pldban hasznltuk -i (in place) s -s (separate) kapcsolkat: ezek a fjlt a lemezen
szerkesztik meg (ott ahol van) s gy, hogy minden fjlt kln (separate). Egybknt a sed az
sszes megclzott fjlt egyetlen bemeneti folyamnak tekinten.

6. Nyomtassuk ki az els olyan sort amelyik kis a betvel kezddik, s utna lpjnk ki:
$ cat test.txt | sed -rn '/^a/{p;q}'

7. Helyettestsnk minden tabultor karaktert 4 szkzzel:


$ echo -e '\t\t\t' | cat -A
^I^I^I$
$ echo -e '\t\t\t' | sed 's/\t/ /g' |cat -A
$
$

8. Szkzzel elvlasztott mezk kezelse, pl.: hrom kzl hagyjuk meg csak a msodik mezt:
$ cat a.txt
aaa bbb ccc
111 222 333
$ cat a.txt | sed -r 's/([^ ]+) ([^ ]+) ([^ ]+)/\2/'

7
UNIX-Linux/hjprogramozs - sed

bbb
222
$

9. A sed megjegyzi a legutbb hasznlt regulris kifejezs az s parancs szmra, s amennyiben


res regulris kifejezst adunk meg, akkor a megjegyzettet hasznlja:
$ cat > b.txt
12
34
$ cat b.txt | sed -r 's/^([0-9])/x/;n;s//y/;'
x2
y4
Helyettesti a sor els szmjegyt egy x-el, utna msik sort vesz, s ugyanazt a pozcit helyettesti
y-al.

4.3. Ritkbban hasznlt parancsok


A sed rendelkezik mg nhny paranccsal, amelyek segtsgvel sszetett mveletekre is kpes.
y/halmaz1/halmaz2/ Karaktercsere (az eredmny azonos a tr programval). A kt halmazban
ugyanannyi karakternek kell lennie. Nem hasznlhatak
karakterfelsorolsok -el (mint a tr programnl).

y/ax/AX/ cserl minden a s x kisbett nagyra

a\ Hozzfzs (append)
szoveg Csak egy cm hasznlhat a parancs eltt. A szoveg -et a mintatr
tartalma utn fzi. Tbb sor beszrsa esetn mindig sorvgi \ -el kell
jelezni, hogy ismt egy sor kvetkezik.
Pl:

a\
Elso sor\
masodik sor

Fontos: az a, i, c parancsokkal beszrt szvegek nem kerlnek tovbbi


feldolgozsra.
i\ Beszrs (insert)
szoveg A mintatr el fzi a szveget.
c\ Vltoztat (change)
szoveg Kicserli a mintatr tartalmt a szveggel.
= Kirja a cmzett sor szmt a kimenetre. Pldul az albbi sed szkript a
wc -l parancsot helyettestheti:
$=
Az utols sornl kirja a sor sorszmt, hasznlata:
$ cat test.txt | sed -n '$='
3
$

8
UNIX-Linux/hjprogramozs - sed

r file Beolvassa a file fjlt. Csak egy cm szerepelhet eltte. Ha file nem
olvashat, sz nlkl dolgozik tovbb. A beolvasott szveg a cmzett sor
utn kerl a kimenetre.
w file Kirja a mintateret egy fjlba. Az indulskor ltrehozza, vagy nulla
hosszra viszi a fjlt ha az ltezik. Ha a file nv tbb w vagy s parancs
utni w kapcsolban szerepel, ezeket ugyanabba a fjlba rja egyms utn.
n Kvetkez sor, next:
j sort vesz a feldolgozand szvegbl, a nlkl, hogy j ciklust kezdene.
Ez eltt kirja a mintateret (amennyiben ez nincs letiltva a -n
kapcsolval). Ha nincs tbb sor, a sed kilp. Az albbi szkript a bemenet
minden msodik sort listzza:
sed -n 'n ; p'
e shell_parancs Az e parancs hatsra a sed vgrehajt egy parancsot a shell alatt, s a
kimenett a mintatrbe rja az ppen beolvasott sor el. A kvetkez
szkript a bemenet msodik sora el szrja az id parancs kimenett:
$id -u
500
$echo -e "a felhaszl azonostm\n-as"
a felhaszl azonostm
-as
$echo -e "a felhaszl azonostm\n-as" | sed '2e id -u'
a felhaszl azonostm
500
-as

4.4. A hold pufferre vonatkoz parancsok


rdekessgknt megemltjk a hold pufferre vonatkoz parancsokat is. A hold puffer szvegsorok
trolst teszi lehetv feldolgozs kzben. Az albbi mveleteket lehet vgezni:
N j sort vesz a bemenetrl, egy jsor karaktert r a mintatr vgre, s utna illeszti a sort. Ha
ez az utols bementi sor, a sed kilp.
P Kirja a mintatr tartalmt az els jsorig.
h A mintateret trja a hold trbe.
H A mintateret a hold tr vgre rja egy jsor karakterrel egytt.
g get: tveszi a hold tr tartalmt a mintatrbe.
G A hold tr tartalmt a mintatr vgre illeszti, el egy jsor karaktert r.
x kicserli a hold s a mintatr tartalmt.
D Kitrl egy sort a mintatrbl: az els jsorig. Ha marad mg szveg a mintatrben, akkor j
ciklust kezd, anlkl, hogy j sort olvasna.

me nhny jl ismert plda:

9
UNIX-Linux/hjprogramozs - sed

1. Beszr egy res sort minden sor utn:


$ cat teszt.txt | sed 'G'

2. "Megfordtja" a bemeneti fjlt, az utols sort elsnek listzza:


$ cat e.txt | sed -n 'G;h; $p'

3. Kt egyms utni sorbl egyet llt el:

#!/bin/sed -nf
#a program sszeragaszt kt egyms utni sort
#mieltt az N vgrehajtdik, mr van egy sor beolvasva
N #kvetkez sor a mintatrbe
s/\n// #trom az jsor karaktert a 2 sor kztt resre
#ezutn a sed automatikusan kirja a mintateret

4. A tac parancs szimullsa ( a tac a cat fordtott mvelett vgzi, fordtva listzza a fjlt,
elsnek az utols sort):

#!/bin/sed -nf
#fordtva listz ki egy llomnyt, mint a tac
#hasznlat:
# sed -nf reverse.sed file.txt

1!G #visszakrjk a teljes hold puffert,


#gy a beolvasott lesz az els sor
#az els sor esetben nem kell ezt csinlni, ezrt 1!
$p #az utols sornl nyomtatunk, minden eddigi sort egyszerre

h #az sszes eddig bekerl a hold pufferbe


#minden ciklus vgn, fordtott sorrendben

Ugyanennek a feladatnak egy msik megoldsa az albbi:

cat file | sed -n -r '1h;1!{x;H};${g;p}'

5. Pldk a sed hasznlatra szkriptekben


A sed hasznlhat parancssorrl, futtathat hosszabb sed szkriptet kln fjlbl s hasznlhat
hjprogramokban kis mveletek elvgzsre. A sed akr tbb fjlon is elvgez parancssoron
kiadott mveleteket ha felsoroljuk azokat argumentumban. gy meghvhatjuk egy-egy nll
feladat elvgzsre szkriptekbl is.

Szkriptekben a sed parancsot egsz kis mveletek kapcsn is hasznljuk, igen gyakran a helyettest
s parancst, ha egy sztringet valamilyen okbl szerkeszteni kell. Ilyen pl. a fggvnyeket
bemutat szekciban az rtk visszatrt plda.

Gyakran hasznljuk szrknt, szveges fjlok elfeldolgozshoz. Az albbi pldban adott CSV
fjlbl pldul a 3. oszlopot szeretnnk hasznlni, ugyanakkor az els sortl meg kellene

10
UNIX-Linux/hjprogramozs - sed

szabadulni:
$ cat lista.csv
Tipus db Ar raktar
A 2 22.50 i
B 1 17.80 i
F 2 17.10 n
G 3 1.12 i
H 2 12.10 i
O 1 12.00 n
$
Az albbi szrs elvgzi a feladatot (a teljes sorra illesztnk regulris kifejezst, s helyette csak a
kivlasztott mezt rjuk vissza, miutn meggyzdnk, hogy az elvlasztk valban szkzk, s
nem tabultorok):

$ cat lista.csv | sed -r '1d;s/^[A-Z] + [0-9] +([^ ]+).*/\1/'


22.50
17.80
17.10
1.12
12.10
12.00

Megjegyzs: a fenti feladatra, ha dolgozni is kell a kivlasztott szmsorral alkalmasabb az awk (lsd
Az awk fejezetet).

Szkriptbl trtn fjl szerkesztsnl viszont inkbb a sed -et hasznljuk.

Pldul ha egy program konfigurcis llomnya gyakran vltozik, paramtereket kell trni benne,
rdemes annak egy sablont kszteni, s a sablont az aktulis vltozkra trni egy szkripttel.
Legyen a kis plda sablonunk (ip.conf.tpl) az albbi:

#tartalom

#IP bellts
IP = $MY_IP

#tartalom

A $MY_IP helyett akarunk egy IP cmet beszrni a szerkesztsnl, s az ip.conf.tpl fjlbl egy
ip.conf nevt ltrehozni. Az albbi kis szkript elvgzi ezt, paramtere az IP szm:

#!/bin/bash
#vltoz helyett egy IP szmot r egy konfigurcis
#llomny sablonjba
#Paramter:
# $1 - IP szm

#ellenrizzk, hogy valban IP szm

TEMPLATE=ip.conf.tpl
CONF=ip.conf

11
UNIX-Linux/hjprogramozs - sed

if ! echo "$1" | egrep -q '^([0-9]{1,3}\.){3}[0-9]{1,3}$'


then
echo make_conf: Nem IP szm: "$1"
exit 1
fi

sed -r '/^IP /s/\$MY_IP/'"$1"'/' "$TEMPLATE" > "$CONF"

Ellenrizzk az IP szm formtumt (felttelezzk, hogy a legegyszerbb alakban jn, s brmilyen


szmot elfogadunk), majd a sed-et szerkesztknt hasznlva ltrehozzuk az j fjlt a kimeneten.
Lthat, hogy a sed parancshvst tbb sztringbl raktuk ssze, mert az aposztrfok kzti sed
parancssor nem terjesztette volna ki a $1 vltoz referencit. A $ metakarakter, gy \$ t runk
ahhoz, hogy literlisan jelenjen meg a regulris kifejezsben. Vgrehajtva elszr hibsan majd
helyesen:

$ bash make_conf.sh 192.168.1


make_conf: Nem IP szm: 192.168.1
$ bash make_conf.sh 192.168.1.1
$ cat ip.conf

#tartalom

#IP bellts
IP = 192.168.1.1

#tartalom

Az kvetkez pldban (elines_clean.sh) kitrljk az res sorokat egy knyvtr szveges


llomnyaibl, de csak azokban, amelyekben tbb res sor van mint egy adott szm. A trlsi
mveletet egyetlen paranccsal vgre lehet hajtani, viszont a kivlasztsi felttelt egyszerbb egy
szkripttel megoldani.

#!/bin/bash
#trli az res sorokat azokbl a szveges llomnyokbl
#amelyekben az res sorok szma meghalad egy N szmot
#Paramterek:
# $1 - clknyvtr neve
# $2 - sorok szma
#

#paramter tvtel
d=${1:? az els paramter a knyvtrnv}

#les szkripteknl ajnlatos ellenrizni, hogy N egsz szm


#ezt itt nem tesszk meg
N=${2:? a msodik paramter a sorok szmnak hatra}

for f in $( ls "$d" )
do

12
UNIX-Linux/hjprogramozs - sed

#ellltom a clfjl teljes elrsi tjt egy vltozban


target="$d/$f";

#ellenrzm, hogy a fjl valban szveges


if ! file "$target" | egrep -q 'text'
then
echo elines_clean: a "$target" nem szveges vagy res,
kihagyva

#ha nem szveges, a j ciklus


continue
fi

#hny res sor van a kivlasztott fjlban


empty=$( egrep '^$' "$target" | wc -l )

if (( empty > N ))
then
sed -i.bak -r '/^$/d' "$target"
echo elines_clean: "$target" szerkesztve
fi
done

Vgrehajtva a teszt_sed knyvtron, amelyet a vgrehajts eltt s utn is listzunk:

$ ls teszt_sed/
1.txt 2.txt 3.txt 4.txt 5.txt
$ bash elines_clean.sh teszt_sed/ 3
elines_clean: teszt_sed//1.txt szerkesztve
elines_clean: teszt_sed//3.txt szerkesztve
elines_clean: a teszt_sed//4.txt nem szveges vagy res,
kihagyva
$ ls teszt_sed/
1.txt 1.txt.bak 2.txt 3.txt 3.txt.bak 4.txt 5.txt
$

Megjegyzsek

1. Mivel a sed stlus szerkeszts megvltoztatja a fjlt, s csak szveges fjlokon van rtelme, ezt
ellenrizzk.

A file parancs kirja egy fjl tpust:


$ file teszt_sed/1.txt
teszt_sed/1.txt: ASCII text
$
ezt a kimenetet ellenrizzk az egrep-el.

2. A sed -i opcival vgzi a helyben val szerkesztst (teht ilyenkor nem a kimenetre rja a
feldolgozott fjlt, hanem meg is szerkeszti). Pl.:
$ sed -i -r '/^$/d' teszt_sed/1.txt

13
UNIX-Linux/hjprogramozs - sed

$
A mvelet veszlyes, mert ilyenkor csak a megszerkesztett fjl marad az 1.txt nv alatt, gy
lehetsg van arra, hogy httr msolatot is ksztsnk. A msolat nevnek kiterjesztst meg lehet
adni kzvetlenl az i opci utn, pl. ha azt karjuk, hogy egy .bak nev kiterjeszts msolat
keletkezzen, a feladatban is hasznlt megolds:
$ sed -i.bak -r '/^$/d' teszt_sed/1.txt
$

3. Fontos: ha egyszerre tbb fjlt adunk meg a parancssoron, a kimenet szempontjbl a sed
egyetlen kimeneti folyamot kszt bellk. gy -i inline szerkeszts esetn meg kell adni, hogy
egyenknt szerkessze a fjlokat, ezt a -s kapcsolval tesszk, s gy meg lehet adni neki egy tbb
fjlt kivlaszt mintt, mint a *.txt :

$ sed -s -i.bak -r '/^$/d' teszt_sed/*.txt


$

Bvtett regulris kifejezseket hasznlunk, ezrt minden esetben alkalmazzuk a -r opcit.

14

You might also like