Professional Documents
Culture Documents
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.
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
Fontosabb kapcsolk:
-e szkript ezt a szkriptet is hozzfzi a vgrehajtandkhoz
-f szkript_file a szkriptet fjlbl veszi
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 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
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.
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
s/ab/xy/
$/s/^a/b/ az utols sor (cme a $ jel) elejn lev kis a karaktert b-re
cserli
5
UNIX-Linux/hjprogramozs - sed
& a teljes regexp ltal illesztett lncot helyettesti (gy a konkrt & karakter
bersra csere karakterlncba \& -et kell hasznlni)
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:
6
UNIX-Linux/hjprogramozs - sed
Tovbbi pldk:
1. Trljk egy szvegbl az res sorokat:
$ cat test.txt | sed -r '/^$/d'
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}'
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
$
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
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
9
UNIX-Linux/hjprogramozs - sed
#!/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
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):
Megjegyzs: a fenti feladatra, ha dolgozni is kell a kivlasztott szmsorral alkalmasabb az awk (lsd
Az awk fejezetet).
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
TEMPLATE=ip.conf.tpl
CONF=ip.conf
11
UNIX-Linux/hjprogramozs - sed
#tartalom
#IP bellts
IP = 192.168.1.1
#tartalom
#!/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}
for f in $( ls "$d" )
do
12
UNIX-Linux/hjprogramozs - sed
if (( empty > N ))
then
sed -i.bak -r '/^$/d' "$target"
echo elines_clean: "$target" szerkesztve
fi
done
$ 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.
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 :
14