Sed: Difference between revisions

From ICO wiki
Jump to navigationJump to search
Kkulla (talk | contribs)
Kkulla (talk | contribs)
No edit summary
 
(61 intermediate revisions by the same user not shown)
Line 1: Line 1:
Kaia AK 31, võtab selle, teema on pooleli
Kaia AK 31


[[Category:Operatsioonisüsteemide administreerimine ja sidumine]]
[[Category:Operatsioonisüsteemide administreerimine ja sidumine]]


=Mis on sed?=
=Mis on sed?=
'''Sed''' on voo redaktor (''stream editor''), mitte-interaktiivne redaktor, mis on loodud Lee E. McMahoni poolt 1973. või 1974. aastal. Lühiajaloo sedist leiab Unixi tööriistade ajaloost [http://www.columbia.edu/~rh120/ch106.x09].  
 
Voo kirjeldamine käib toru (''pipe'') kaudu.
'''Sed''' on voo redaktor (''stream editor''), mis on loodud Lee E. McMahoni poolt 1973. kuni 1974. aastal. Lühiajaloo sedist leiab Unixi tööriistade ajaloost [http://www.columbia.edu/~rh120/ch106.x09].  
See, mis eristab sedi teistest redaktoritest, nagu vi ja ed, on tema võime filtreerida teksti, mida ta saab sisendina torust. Sedi kutsutakse teinekord ka pakkredaktoriks (''batch editor''), sest teda ei ole vaja  tema töötamise ajal redaktoriga mõjutada. See iseärasus võimaldab kasutada redigeerimise käskusid skriptis, mis on üpris leevendav korduvate redigeerimiste puhul. Kui on vaja teha asendusi väga suurtes tekstifailides, siis sed on selleks väga hea abiline.
 
Sedi käsu süntaksil ei ole väljundfaili spetsifikatsiooni, kuid tulemused saab salvestada teise nimega faili, kasutades väljundi suunamist. Kui sisendiks on fail, siis sed ei riku originaali ära.
Sedi töötamise põhimõte on: Sed võtab sisendvoost andmed, töötleb neid vastavalt etteantud korraldusele ja kirjutab tulemuse väljundisse.
 
Sedi sisendiks on voog, mis võib olla ka tekstifail, millest filtreeritakse vajalik(ud) sõne(d) ja mis kirjutatakse väljundisse. See asjaolu eristab sedi teistest redaktoritest, nagu vi ja ed. Väljundvoo võib kirjutada toru (''pipe'') kaudu teise programmi või suunamismärgi (''>'') kaudu teise tekstifaili.
 
Sedi kutsutakse teinekord ka pakkredaktoriks (''batch editor''), sest tema töötamise ajal ei vaja sed redigeerimist. See iseärasus võimaldab kasutada redigeerimise käskusid skriptis, mis on üpris leevendav korduvate redigeerimiste puhul ja mis ongi sedi kasutamise peamine eesmärk. Kui on vaja teha asendusi väga suurtes tekstifailides, siis sed on selleks väga hea abiline.
 
Sedi käsu süntaksil ei ole väljundfaili spetsifikatsiooni, kuid tulemused saab salvestada teise nimega faili, kasutades väljundi suunamist. Kui sisendiks on fail, siis sed ei riku originaalfaili ära.


NB! Mitte kõik sed versioonid ei ole võrdsed: Linux kasutab GNU sedi, BSD kasutab oma sedi versiooni, mis on natukene erinev.
NB! Mitte kõik sed versioonid ei ole võrdsed: Linux kasutab GNU sedi, BSD kasutab oma sedi versiooni, mis on natukene erinev.


=Spetsiaalne tähemärk=
Tekstis on kasutatud mõistet '''sõne''', milleks võib olla suvaline märgijada, tavaliselt teksti kujul. Märgiks võib olla ka tühik.
Sedist on kergem aru saada neil, kes oskavad kasutada käsku '''grep''', sest sedi tavaväljendid on praktiliselt samad, mis käsu grep puhulgi, kuid ühe erisusega: kaldkriips "'''/'''" on sedis spetsiaalne tähemärk. Seega saab sediga teha sama, mis grepigagi, millega ei saa kasutada käsku "otsi ja asenda".  
 
==Spetsiaalne tähemärk==
 
Sedist on kergem aru saada neil, kes oskavad kasutada käsku '''grep''', sest sedi tavaväljendid on praktiliselt samad, mis käsu grep puhulgi, kuid ühe erisusega: kaldkriips "'''/'''" on sedis spetsiaalne tähemärk. Seega saab sediga teha sama, mis grepigagi, kuid grepiga ei saa kasutada käsku "otsi ja asenda".
 
==Apostroofid==


=Apostroofid=
Sedi käsud tuleb kirjutada käsurealt antuna apostroofide (' ') vahele, et vältida shelli töökeskkonna paisumist (eriti BASH’is).
Sedi käsud tuleb kirjutada käsurealt antuna apostroofide (' ') vahele, et vältida shelli töökeskkonna paisumist (eriti BASH’is).


=Kuidas sed töötab?=
=Kuidas sed töötab?=
Sed loeb standardsisendist ühe rea kaupa. Sed on rea põhine: sed opereerib tekstis ridadega. Iga rea kohta käivitab sed seeria redigeerimise toiminguid, seejärel see rida kirjutatakse STDOUT’i.  (STDOUT – sisendfailid kirjutatakse standardväljundisse redigeerimise käsuga, mida on täpsustatud rakendatava skriptiga. Kui täpsustus on '''–n''' suvandiga, siis valitakse skripti poolt ainult need sisendread ja kirjutatakse standardväljundisse.)
Sed loeb standardsisendist ühe rea kaupa. Sed on rea põhine: sed opereerib tekstis ridadega. Iga rea kohta käivitab sed seeria redigeerimise toiminguid, seejärel see rida kirjutatakse STDOUT’i.  (STDOUT – sisendfailid kirjutatakse standardväljundisse redigeerimise käsuga, mida on täpsustatud rakendatava skriptiga. Kui täpsustus on '''–n''' suvandiga, siis valitakse skripti poolt ainult need sisendread ja kirjutatakse standardväljundisse.)


=Sedi käivitamine=
Sedi paremaks mõistmiseks kirjeldan seda näite kaudu, kasutades selleks ühte näidisteksti (naidis.txt).
Sedi paremaks mõistmiseks kirjeldan seda näite kaudu, kasutades selleks ühte näidisteksti (naidis.txt).


==Ridade printimine==
==Ridade printimine==
Näide:
Näide:
Minu näite näidisfaili (naidis.txt) tekst on järgmine:
Minu näite näidisfaili (naidis.txt) tekst on järgmine:


[[File:naidis.png]]
[[File:algtekst.png]]


Kuvame näiteks tekstifaili naidis.txt esimesed 4 rida
Tekstifailis naidis.txt näiteks esimese 3 rea kuvamine:
<pre>bash~$ sed '4q' naidis.txt</pre>


[[File:4rida.png]]
<pre>sed '3q' naidis.txt</pre>


NB! Pea meeles, et sed prindib vaikimisi oma tulemused standardväljundisse, mis antud juhul on terminali aken. Sedi käivitamisel tuleb suunata andmed tema sisendisse, näidata, milliseid sedi käske rakendada ja kuhu väljund suunata. Kui sa tahad salvestada selle väljundi kuhugi faili, suuna see:
NB! Pea meeles, et sed prindib vaikimisi oma tulemused standardväljundisse, mis antud juhul on terminali aken. Sedi käivitamisel tuleb suunata andmed tema sisendisse, näidata, milliseid sedi käske rakendada ja kuhu väljund suunata. Kui sa tahad salvestada selle väljundi kuhugi faili, suuna see:


<pre>bash~$ cat naidis.txt | sed '4q' > 4.esimest.rida.txt</pre>
<pre>cat naidis.txt | sed '3q' > 3.esimest.rida.txt</pre>


==Mitu käsku samaaegselt==
==Mitu käsku samaaegselt==


Kui tegemist on samaaegselt mitme käsuga, siis tuleb iga käsu ette kirjutama '''-e'''.  
Kui tegemist on samaaegselt mitme käsuga, siis tuleb iga käsu ette kirjutada '''-e'''.  
 
<pre>bash~$ cat naidis.txt | sed -e '4q' -e '2q'</pre>


[[File:mitu_kasku.png]]
<pre>cat naidis.txt | sed -e '3q' -e '2q'</pre>


==Otsitava sõnega rea printimine==
==Otsitava sõnega rea printimine==


Kui me tahame, et sed leiaks üles kõik read, kus on vigane tekst, siis kasutame käsku '''p''' (print), et saavutada oma tulemuse:
Kui me tahame, et sed leiaks üles kõik read, kus on vigane tekst, siis kasutame käsku '''p''' (''print''):


<pre>~$ sed '/veasid/p' naidis.txt</pre>
<pre>sed '/veasid/p' naidis.txt</pre>


[[File:veasid.png]]
[[File:veasid.png]]
Line 56: Line 65:
Antud käsu tulemusel prinditakse välja kogu faili sisu ja need read, kus antud sõne esineb, kaks korda. Ilmselgelt ei soovinud me sellist tulemust. Kui tahta, et prinditakse ekraanile ainult need read, mis vastaksid meie soovile, tuleb kasutada suvandit '''–n''':  
Antud käsu tulemusel prinditakse välja kogu faili sisu ja need read, kus antud sõne esineb, kaks korda. Ilmselgelt ei soovinud me sellist tulemust. Kui tahta, et prinditakse ekraanile ainult need read, mis vastaksid meie soovile, tuleb kasutada suvandit '''–n''':  


<pre>~$ sed -n '/veasid/p' naidis.txt</pre>
<pre>sed -n '/veasid/p' naidis.txt</pre>
 
[[File:nveasid.png]]


==Ridade valik==
==Ridade valik==
Line 71: Line 78:


==Asendamine==
==Asendamine==
Sed’il on rida käskusid, kuid üks peamisi on asendamise käsk '''s''' (ingl. k. ''substitute''). Asendamise käsk annab kõikidele tavalistele avaldistele uue väärtuse. Asendamine toimub järgmise skeemi kohaselt:
Sed’il on rida käskusid, kuid üks peamisi on asendamise käsk '''s''' (ingl. k. ''substitute''). Asendamise käsk annab kõikidele tavalistele avaldistele uue väärtuse. Asendamine toimub järgmise skeemi kohaselt:


<pre>sed 's/asendatav_sõne/asendaja_sõne/lipp' <vana_fail >uus_fail</pre>
<pre>sed 's/vana_sõne/uus_sõne/lipp' failinimi</pre>


Asendamise käsk koosneb seega neljast osast.
Asendamise käsk koosneb seega neljast osast.
Line 81: Line 89:
/../../ eraldaja
/../../ eraldaja


asendatav (otsitav) sõne - sõne, mida failist ostitakse
vana (asendatav) sõne - sõne, mida failist otsitakse
 
asendaja sõne - sõne, millega asendatakse asendatav (otsitav) sõne


Otsitav sõne on vasakul pool ja asendaja sõne on paremal pool.
uus sõne - sõne, millega asendatakse vana (otsitav) sõne


Lipp – kontrollib tegevust ja võib olla:
Lipp – kontrollib tegevust ja võib olla:
Line 97: Line 103:
w ''file'' = lisab rea failile ainult siis, kui otsitav on leitud
w ''file'' = lisab rea failile ainult siis, kui otsitav on leitud


Nt parandan (asendan) naidis.txt failis ära sõne „veasid“ sõneks „vigu“ ja loon uue faili.  
Nt parandan (asendan) naidis.txt failis ära sõne „veasid“ sõneks „vigu“.  
 
<pre>sed 's/veasid/vigu/' <naidis.txt >uusnaidis.txt </pre>


või ka
<pre>sed 's/veasid/vigu/' naidis.txt</pre>
 
<pre>sed 's/veasid/vigu/' naidis.txt >uusnaidis.txt</pre>


[[File:asendus1.png]]
[[File:asendus1.png]]
Line 109: Line 111:
Antud juhul see tulemus ei rahulda, sest 5. real on ainult esimesena ilmnenud vigane sõne ära parandatud, kuid üks „veasid“ on veel jätkuvalt alles. Selleks, et sed kontrolliks tervet rida ja ei jääks esimese leitud sõne juures pidama, kasuta võtit '''g'''.  
Antud juhul see tulemus ei rahulda, sest 5. real on ainult esimesena ilmnenud vigane sõne ära parandatud, kuid üks „veasid“ on veel jätkuvalt alles. Selleks, et sed kontrolliks tervet rida ja ei jääks esimese leitud sõne juures pidama, kasuta võtit '''g'''.  


<pre>sed 's/veasid/vigu/g' <naidis.txt >uusnaidis.txt</pre>
<pre>sed 's/veasid/vigu/g' naidis.txt</pre>
 
[[File:veasid1.png]]


Samas, kui tahta muuta reas nt ainult teisena esinevat sama sõna, siis kasuta järgmist käsku:
Samas, kui tahta muuta reas nt ainult teisena esinevat sama sõna, siis kasuta järgmist käsku:
Line 117: Line 117:
<pre>sed 's/veasid/vigu/2' naidis.txt</pre>
<pre>sed 's/veasid/vigu/2' naidis.txt</pre>


[[File:vigu2.png]]
==Muudetud sisuga (asendatud sõnedega) faili loomine==
 
==Faili loomine, kus on muudetud (asendatud sõnedega) sisuga read==
 
<pre>sed –n 's/veasid/vigu/p' naidis.txt >uuuus.txt</pre>
 
analoogne tulemuse saab:
 
<pre>sed 's/veasid/vigu/w uuuus.txt' naidis.txt</pre>


[[File:muudetud_sisu.png]]
Tihti on kasulik muudatustega read salvestada uude faili.


Nagu selgus, jäi teise ritta veel üks vigane sõne, seega õige oleks olnud:
<pre>sed -n 's/veasid/vigu/pg' naidis.txt >uus.txt</pre>
 
<pre>sed –n 's/veasid/vigu/pg' naidis.txt >uuuus.txt</pre>
 
[[File:muudetud_sisu1.png]]
 
Analoogse tulemuse annab käsk
 
<pre>sed 's/veasid/vigu/gw uuuus.txt' naidis.txt</pre>


==Adresseerimine (lisamine)==
==Adresseerimine (lisamine)==
Line 161: Line 145:
==Mitu asendust korraga==
==Mitu asendust korraga==


Mitme üheaegselt antud käsud tuleb eraldada individuaalse '''–e''' suvandiga.
Üheaegselt antud mitu käsku tuleb eraldada individuaalse '''–e''' suvandiga.
 
<pre>sed -e 's/vana_sone1/uus_sone1/g' -e 's/vana_sone2/uus_sone2/g' naidis.txt</pre>


[[File:mitu_kasku1.png]]
[[File:mitu_kasku1.png]]
Juhul, kui asendada mitu erinevat sõne ühe sõnega, siis on käsuks:
<pre>sed 's/sõne1/sõne4/g;s/sõne2/sõne4/g;s/sõne3/sõne4/g'</pre>
GNU sediga võib eelneva mitmekordse asenduse käivitada ka järgmise käsuga:
<pre>sed 's/sõne1\|sõne2\|sõne3/sõne4/g'</pre>


==Kustutamine==
==Kustutamine==


Kustutamine toimub käsuga '''d''' (ingl. k. ''delete'').
Kustutamine toimub käsuga '''d''' (ingl. k. ''delete'').
<pre>sed 'algus_sõne,lõpp_sõned' naidis.txt</pre>


===Konkreetsete ridade kustutamine===
<pre>sed '/sõne/d' failinimi</pre>
Konkreetsete ridade kustutamiseks alates konkreetsest reast kuni lõpuni (teisalt, sama käsku saab kasutada ka printimiseks faili algusest kuni konkreetse reani).
 
<pre>Sed '3,$d' naidis.txt</pre>
Ridade vahemiku kustutamine üldkirjapilt on:
 
<pre>sed 'algusrea_nr,lõpprea_nrd' failinimi</pre>
 
Käsu '''d''' tulemusel jääb alles tekst, kust on eemaldatud need '''read''', mis sisaldusid käsus.
 
===Kustutamine konkreetsest reast alates kuni lõpuni===
 
Ridade kustutamiseks alates konkreetsest reast (rea numbrist) kuni faili lõpuni, tuleb kasutada järgmist käsku:
 
<pre>sed '3,$d' naidis.txt</pre>
 
[[File:kustutamine.png]]
[[File:kustutamine.png]]
Selle käsu tulemusena prinditakse kaks esimest rida sellest näitefailist.
Selle käsu tulemusena prinditakse kaks esimest rida sellest näitefailist.


Kustutame read, mis sisaldavad vigu. Selles näites on need read 4 kuni 5. Täpsustame vahemikku koos käsuga '''d'''.  
Teisalt saab sama käsku kasutada ka printimiseks faili algusest kuni selle konkreetse reani.
 
===Kustutamine algusest kuni konkreetset sõnet sisaldava reani===
 
Soovides kustutada alates esimesest reast kuni konkreetset sõnet sisaldava reani:
 
<pre>sed '1,/korrektselt/d' naidis.txt</pre>
 
[[File:esimesest_reast.png]]
 
===Ridade vahemiku kustutamine===
 
Kustutame näitefailis vigu sisaldavad read (3. ja 4. rida), selleks tuleb kasutada käsku:


[[File:kustutamine1.png]]
<pre>sed '3,4d' naidis.txt</pre>


Sama tulemuse saame, kui kirjutame:
NB! Juhul, kui tahta kustutada näidisfailis ridade vahemikku (nt ridu 2 kuni 20), siis kuna nii palju ridu näidisfailis ei ole, kustutatakse nii palju ridu kui saab.
<pre>sed '/veasid/d' naidis.txt</pre>
d käsu tulemusel kuvatakse tekst, kust on eemaldatud need read, kus otsitav sõne esines.


===Kustutamine konkreetsest sõnest konkreetse sõneni===
===Kustutamine konkreetsest sõnest konkreetse sõneni===


Nüüd käsk, kus alustades etteantud sõnega ja lõpetades teise etteantud sõnega.
Tihti ei ole aga ridade numbrid teada, siis on abiks käsk, kus kustutatakse need read, mis jäävad esimese etteantud sõne ja teise etteantud sõne vahele.
 
<pre>sed -n '/^algus_sone.*lopp_sone$/p' failinimi</pre>
 
[[File:sonest_soneni.png]]
[[File:sonest_soneni.png]]


===Kõikide ridade kustutamine, v.a ühe rea===
===Kõikide ridade kustutamine, v.a ühe rea===
Soovides kustutada kõik read peale viienda
 
Soovides kustutada kõik read peale väljavalitu (antud näites viies rida):
 
<pre>sed '5!d' naidis.txt</pre>
<pre>sed '5!d' naidis.txt</pre>


[[File:koik_peale_yhe.png]]
[[File:koik_peale_yhe.png]]


===Ridade vahemiku kustutamine===
===Viimase rea kustutamine===
Kustutame näiteks teisest kuni kahekümnenda reani. Kui ridu nii palju pole, kustutatakse nii palju kui saab.
<pre>sed ’2,20d’ naidis.txt</pre>
[[File:reast_reani.png]]


===Kustutamine esimesest reast kuni konkreetse reani===
Soovides kustutada ainult viimast rida:  
Soovides kustutada alates esimesest reast kuni konkreetset sõnet sisaldava reani:  
<pre>sed '1,/korrektselt/d' naidis.txt</pre>


[[File:esimesest_reast.png]]
<pre>sed ’$d’ naidis.txt</pre>


===Viimase rea kustutamine===
Soovides kustutada viimast rida
<pre>sed ’$d’ naidis.txt</pre>
[[File:viimane_rida.png]]
[[File:viimane_rida.png]]


===Kustutamisel tühikuga asendamine===
===Kustutamisel tühikuga asendamine===


Eeltoodud näidete puhul kustutati terve rida, kuid teinekord on vaja kustutada vaid sõne selles reas, jättes ülejäänud teksti alles. Selleks tarbeks kasuta käsku kujul:
Eeltoodud näidete puhul kustutati terve rida, kuid teinekord on vaja kustutada vaid sõne selles reas, jättes ülejäänud teksti alles. Selleks tarbeks saab kasutada käsku kujul:
 
<pre>sed 's/veasid//g' naidis.txt</pre>  
<pre>sed 's/veasid//g' naidis.txt</pre>  
[[File:tyhik.png]]
[[File:tyhik.png]]
Tulemuseks on kustutatud kõik eksisteerinud sõned "veasid" ja asendatud need tühikuga.


==Muutmine==
==Muutmine==
===Käsureal jooksvalt faili muutmine===
===Käsureal jooksvalt faili muutmine===
Selleks tuleb anda käsk  
Selleks tuleb anda käsk  
<pre>sed -i -e 'sedi käsud' failinimi</pre>
<pre>sed -i -e 'sedi käsud' failinimi</pre>
Näiteks asendame failis kõik sõnad esimene, teisega.
 
Näiteks asendame failis kõik sõned "esimene", sõnega "teine".
 
<pre>sed -i -e 's/esimene/teine/g' naidis.txt</pre>
<pre>sed -i -e 's/esimene/teine/g' naidis.txt</pre>
[[File:jooksvalt_muutmine.png]]
[[File:jooksvalt_muutmine.png]]


===Teatud ridade muutmine===
===Teatud ridade muutmine===
Asendame failis sõne "on" sõnega "ei ole" igal real, kus see sõne sisaldub.
Asendame failis sõne "on" sõnega "ei ole" igal real, kus see sõne sisaldub.
<pre>sed '/see/s/on/ei ole/g' naidis.txt</pre>
<pre>sed '/see/s/on/ei ole/g' naidis.txt</pre>
[[File:teatud_rida.png]]
[[File:teatud_rida.png]]


==Lõpetamine==
===Reavahede lisamine===
Sedile on võimalik käsuga '''q''' (ingl. k. ''quit'') öelda, et ta teatud tingimusel lihtsalt lõpetaks ja ei täidaks eelnevalt antud käsku.
 
<pre>sed '1 q'</pre>
Kahekordse reavahe lisamine:
 
<pre>sed 'G' failinimi</pre>
 
Kahekordse reavahe lisamine, kui failis olevas tekstis on vähemalt üks tühi rida:
 
<pre>sed '/^$/d;G' failinimi</pre>
 
Tühja rea tagasivõtmine (kustutamine), kui see tühi rida on paarisnumbriline:
 
<pre>sed 'n;d' failinimi</pre>
 
Tühja rea lisamine iga rea ette, mis sisaldab konkreetset sõne:
 
<pre>sed '/sõne/{x;p;x;}' failinimi</pre>
 
Tühja rea lisamine iga rea järele, mis sisaldab konkreetset sõne:
 
<pre>sed '/sõne/G' failinimi</pre>
 
Tühja rea lisamine nii iga rea ette kui ka järele, mis sisaldab konkreetset sõne:
 
<pre>sed '/sõne/{x;p;x;G;}' failinimi</pre>


=Käskude tabel=
===Ridade nummerdamine===
[[Käsk]]    Tulemus


[[a\]]     aktiivse rea alla teksti lisamine
Iga rea ette tekstiga samale reale reanumbri lisamine:


[[c\]]     aktiivsel real teksti muutmine uue tekstiga
<pre>sed = failinimi | sed 'N;s/\n/\t/'</pre>


[[d]]     teksti kustutamine
Järgmine käsk nummerdab samuti ridu failis, kuid reanumbrid tekivad tekstireale eelnevale reale:


[[i\]]     Aktiivse rea ette teksti lisamine
<pre>sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'</pre>


[[p]]     Teksti printimine
Järgmine käsk nummerdab samuti ridu failis ja reanumbrid tekivad tekstireale samale reale, kuid kui rida on tühi, siis sinna ette reanubmrit ei prindita:


[[r]]     Faili lugemine
<pre>sed '/./=' filename | sed '/./N; s/\n/ /'</pre>


[[s]]     Teksti otsimine ja asendamine
==Lõpetamine==


[[w]]     Faili kirjutamine
Sedile on võimalik käsuga '''q''' (ingl. k. ''quit'') öelda, et ta teatud tingimusel lihtsalt lõpetaks ja ei täidaks eelnevalt antud käsku.


=Suvandite tabel=
<pre>sed '2 q'</pre>
[[Suvand]]      Mõju


[[-e SCRIPT]] Käskude lisamine skripti käskude paketti sisendi töötlemise ajal töötamiseks
Nimetatud käsk prindib 2 tühja rida (tuleb Enter klahvi 2 korda vajutada) ja väljub.


[[-f]] Käskude lisamine SCRIPT-FILE sisaldavatesse failide käskude paketti sisendi töötlemise ajal töötamiseks
=Sedi käsud ja võtmed=


[[-n]] Vaikne töörežiim
'''Käsk ja tulemus'''


[[-V]] Versiooni informatsiooni printimine ja väljumine
* a\ - aktiivse rea alla teksti lisamine


=Sedi tavalised väljendid=
* c\ - aktiivsel real teksti muutmine uue tekstiga
[[^]] rea alguse tähis
     
* d  - teksti kustutamine


[[$]] rea lõpu tähis 
* i\ - aktiivse rea ette teksti lisamine
   
 
[[.]] suvalise üksiku tähemärgi tähis
* p - teksti printimine


[[(tähemärk)*]] mitme meelevaldse tähemärgi olemasolu tähis
* r  - faili lugemine


[[(tähemärk)?]] 0 või 1 (tähemärgi) astmega ühtimine
* s  - teksti otsimine ja asendamine


[[[abcdef]]] lubatud on kõik meelevaldsed tähemärgid, mis on kandiliste sulgude vahel [] (antud juhul a b c d e või f) tähemärkide ulatuses [a-z].
* w  - faili kirjutamine
[[[^abcdef]]] tähistab misiganes tähemärki, mis ei ole kandiliste sulgude [] vahel (antud näites kõik märgid, v.a a b c d e või f)


[[(tähemärk)\{m,n\}]] tähistab tähemärgi m-n kordust


[[(tähemärk)\{m,\}]] tähistab märgi m või enama (tähemärkide) kordust
'''Võtmed ja mõju'''


[[(tähemärk)\{,n\}]] tähistab n või vähema (tähemärgi) (võimalik 0) kordust
* -e SCRIPT - käskude lisamine skripti käskude paketti sisendi töötlemise ajal töötamiseks


[[(tähemärk)\{n\}]] tähistab täpselt n (tähemärgi) kordust
* -f        - käskude lisamine SCRIPT-FILE sisaldavatesse failide käskude paketti sisendi töötlemise ajal töötamiseks


[[\(sõne\)]] grupi operaator
* -n        - vaikne töörežiim


[[\n]] tagasiviitamine – tähistab n-ndat gruppi
* -V        - versiooni informatsiooni printimine ja väljumine


[[sõne1\|sõne2]] tähistab sõnet 1 või sõnet 2. Töötab GNU sediga, kuid ei pruugi töötada teiste sedi vormidega.


=Kasutatud materjal=
=Kasutatud materjal=


Unix and Linux, Sed Tutorial, [http://www.panix.com/~elflord/unix/sed.html]
* Unix and Linux, Sed Tutorial, http://www.panix.com/~elflord/unix/sed.html<br/>


Sed - An Introduction and Tutorial, [http://www.grymoire.com/Unix/Sed.html]
* Sed - An Introduction and Tutorial, http://www.grymoire.com/Unix/Sed.html<br/>


Linuxtopia,[http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_05_02.html]
* Linuxtopia, http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_05_02.html<br/>


Zytrax Communications, [http://zytrax.com/tech/web/regex.htm]
* Zytrax Communications, http://zytrax.com/tech/web/regex.htm<br/>


Bash-Beginners-Guide, [http://tldp.org/LDP/Bash-Beginners-Guide/html/chap_05.html]
* Bash-Beginners-Guide, http://tldp.org/LDP/Bash-Beginners-Guide/html/chap_05.html<br/>


Doctor Bob's Lowfat Linux, [http://lowfatlinux.com/linux-sed.html]
* Doctor Bob's Lowfat Linux, http://lowfatlinux.com/linux-sed.html<br/>


sed FAQ, version 014, [http://www.faqs.org/faqs/editor-faq/sed/]
* sed FAQ, version 014, http://www.faqs.org/faqs/editor-faq/sed/<br/>
 
* Wikipedia, http://en.wikipedia.org/wiki/Sed<br/>
* USEFUL ONE-LINE SCRIPTS FOR SED http://sed.sourceforge.net/sed1line.txt

Latest revision as of 15:40, 28 January 2011

Kaia AK 31

Mis on sed?

Sed on voo redaktor (stream editor), mis on loodud Lee E. McMahoni poolt 1973. kuni 1974. aastal. Lühiajaloo sedist leiab Unixi tööriistade ajaloost [1].

Sedi töötamise põhimõte on: Sed võtab sisendvoost andmed, töötleb neid vastavalt etteantud korraldusele ja kirjutab tulemuse väljundisse.

Sedi sisendiks on voog, mis võib olla ka tekstifail, millest filtreeritakse vajalik(ud) sõne(d) ja mis kirjutatakse väljundisse. See asjaolu eristab sedi teistest redaktoritest, nagu vi ja ed. Väljundvoo võib kirjutada toru (pipe) kaudu teise programmi või suunamismärgi (>) kaudu teise tekstifaili.

Sedi kutsutakse teinekord ka pakkredaktoriks (batch editor), sest tema töötamise ajal ei vaja sed redigeerimist. See iseärasus võimaldab kasutada redigeerimise käskusid skriptis, mis on üpris leevendav korduvate redigeerimiste puhul ja mis ongi sedi kasutamise peamine eesmärk. Kui on vaja teha asendusi väga suurtes tekstifailides, siis sed on selleks väga hea abiline.

Sedi käsu süntaksil ei ole väljundfaili spetsifikatsiooni, kuid tulemused saab salvestada teise nimega faili, kasutades väljundi suunamist. Kui sisendiks on fail, siis sed ei riku originaalfaili ära.

NB! Mitte kõik sed versioonid ei ole võrdsed: Linux kasutab GNU sedi, BSD kasutab oma sedi versiooni, mis on natukene erinev.

Tekstis on kasutatud mõistet sõne, milleks võib olla suvaline märgijada, tavaliselt teksti kujul. Märgiks võib olla ka tühik.

Spetsiaalne tähemärk

Sedist on kergem aru saada neil, kes oskavad kasutada käsku grep, sest sedi tavaväljendid on praktiliselt samad, mis käsu grep puhulgi, kuid ühe erisusega: kaldkriips "/" on sedis spetsiaalne tähemärk. Seega saab sediga teha sama, mis grepigagi, kuid grepiga ei saa kasutada käsku "otsi ja asenda".

Apostroofid

Sedi käsud tuleb kirjutada käsurealt antuna apostroofide (' ') vahele, et vältida shelli töökeskkonna paisumist (eriti BASH’is).

Kuidas sed töötab?

Sed loeb standardsisendist ühe rea kaupa. Sed on rea põhine: sed opereerib tekstis ridadega. Iga rea kohta käivitab sed seeria redigeerimise toiminguid, seejärel see rida kirjutatakse STDOUT’i. (STDOUT – sisendfailid kirjutatakse standardväljundisse redigeerimise käsuga, mida on täpsustatud rakendatava skriptiga. Kui täpsustus on –n suvandiga, siis valitakse skripti poolt ainult need sisendread ja kirjutatakse standardväljundisse.)

Sedi paremaks mõistmiseks kirjeldan seda näite kaudu, kasutades selleks ühte näidisteksti (naidis.txt).

Ridade printimine

Näide:

Minu näite näidisfaili (naidis.txt) tekst on järgmine:

Tekstifailis naidis.txt näiteks esimese 3 rea kuvamine:

sed '3q' naidis.txt

NB! Pea meeles, et sed prindib vaikimisi oma tulemused standardväljundisse, mis antud juhul on terminali aken. Sedi käivitamisel tuleb suunata andmed tema sisendisse, näidata, milliseid sedi käske rakendada ja kuhu väljund suunata. Kui sa tahad salvestada selle väljundi kuhugi faili, suuna see:

cat naidis.txt | sed '3q' > 3.esimest.rida.txt

Mitu käsku samaaegselt

Kui tegemist on samaaegselt mitme käsuga, siis tuleb iga käsu ette kirjutada -e.

cat naidis.txt | sed -e '3q' -e '2q'

Otsitava sõnega rea printimine

Kui me tahame, et sed leiaks üles kõik read, kus on vigane tekst, siis kasutame käsku p (print):

sed '/veasid/p' naidis.txt

Antud käsu tulemusel prinditakse välja kogu faili sisu ja need read, kus antud sõne esineb, kaks korda. Ilmselgelt ei soovinud me sellist tulemust. Kui tahta, et prinditakse ekraanile ainult need read, mis vastaksid meie soovile, tuleb kasutada suvandit –n:

sed -n '/veasid/p' naidis.txt

Ridade valik

Järgmine käsk:

sed –n '/tegelikult/,/piinlik/p' naidis.txt

prindib esimese rea, mis sisaldab sõnet „tegelikult“, kuni ja kaasa arvatud reani, kus leidub sõne „piinlik“

Asendamine

Sed’il on rida käskusid, kuid üks peamisi on asendamise käsk s (ingl. k. substitute). Asendamise käsk annab kõikidele tavalistele avaldistele uue väärtuse. Asendamine toimub järgmise skeemi kohaselt:

sed 's/vana_sõne/uus_sõne/lipp' failinimi

Asendamise käsk koosneb seega neljast osast.

s - asendamise käsk

/../../ eraldaja

vana (asendatav) sõne - sõne, mida failist otsitakse

uus sõne - sõne, millega asendatakse vana (otsitav) sõne

Lipp – kontrollib tegevust ja võib olla:

g = kordab samal real

N = ainult N-nda rea olemasolul

p = väljundisse tuleb rida vaid siis, kui otsitav on leitud (vajab –n suvandit, et teisi ridasid mitte kaasata otsingusse)

w file = lisab rea failile ainult siis, kui otsitav on leitud

Nt parandan (asendan) naidis.txt failis ära sõne „veasid“ sõneks „vigu“.

sed 's/veasid/vigu/' naidis.txt

Antud juhul see tulemus ei rahulda, sest 5. real on ainult esimesena ilmnenud vigane sõne ära parandatud, kuid üks „veasid“ on veel jätkuvalt alles. Selleks, et sed kontrolliks tervet rida ja ei jääks esimese leitud sõne juures pidama, kasuta võtit g.

sed 's/veasid/vigu/g' naidis.txt

Samas, kui tahta muuta reas nt ainult teisena esinevat sama sõna, siis kasuta järgmist käsku:

sed 's/veasid/vigu/2' naidis.txt

Muudetud sisuga (asendatud sõnedega) faili loomine

Tihti on kasulik muudatustega read salvestada uude faili.

sed -n 's/veasid/vigu/pg' naidis.txt >uus.txt

Adresseerimine (lisamine)

Adresseerimise mõte on näidata, millistele ridadele käske rakendada. Kui sa ei näita aadressi, siis rakendatakse käske igale reale.

Lisamine rea algusesse

Failis mingi sõne või sümboli (antud juhul sümboli > lisamine) lisamine rea algusesse.

sed 's/^/> /' naidis.txt

Lisamine rea lõppu

Iga rea lõppu mingi sõne sisestamine

sed 's/$/ OK /' naidis.txt

Mitu asendust korraga

Üheaegselt antud mitu käsku tuleb eraldada individuaalse –e suvandiga.

sed -e 's/vana_sone1/uus_sone1/g' -e 's/vana_sone2/uus_sone2/g' naidis.txt

Juhul, kui asendada mitu erinevat sõne ühe sõnega, siis on käsuks:

sed 's/sõne1/sõne4/g;s/sõne2/sõne4/g;s/sõne3/sõne4/g'

GNU sediga võib eelneva mitmekordse asenduse käivitada ka järgmise käsuga:

sed 's/sõne1\|sõne2\|sõne3/sõne4/g'

Kustutamine

Kustutamine toimub käsuga d (ingl. k. delete).

sed '/sõne/d' failinimi

Ridade vahemiku kustutamine üldkirjapilt on:

sed 'algusrea_nr,lõpprea_nrd' failinimi

Käsu d tulemusel jääb alles tekst, kust on eemaldatud need read, mis sisaldusid käsus.

Kustutamine konkreetsest reast alates kuni lõpuni

Ridade kustutamiseks alates konkreetsest reast (rea numbrist) kuni faili lõpuni, tuleb kasutada järgmist käsku:

sed '3,$d' naidis.txt

Selle käsu tulemusena prinditakse kaks esimest rida sellest näitefailist.

Teisalt saab sama käsku kasutada ka printimiseks faili algusest kuni selle konkreetse reani.

Kustutamine algusest kuni konkreetset sõnet sisaldava reani

Soovides kustutada alates esimesest reast kuni konkreetset sõnet sisaldava reani:

sed '1,/korrektselt/d' naidis.txt

Ridade vahemiku kustutamine

Kustutame näitefailis vigu sisaldavad read (3. ja 4. rida), selleks tuleb kasutada käsku:

sed '3,4d' naidis.txt

NB! Juhul, kui tahta kustutada näidisfailis ridade vahemikku (nt ridu 2 kuni 20), siis kuna nii palju ridu näidisfailis ei ole, kustutatakse nii palju ridu kui saab.

Kustutamine konkreetsest sõnest konkreetse sõneni

Tihti ei ole aga ridade numbrid teada, siis on abiks käsk, kus kustutatakse need read, mis jäävad esimese etteantud sõne ja teise etteantud sõne vahele.

sed -n '/^algus_sone.*lopp_sone$/p' failinimi

Kõikide ridade kustutamine, v.a ühe rea

Soovides kustutada kõik read peale väljavalitu (antud näites viies rida):

sed '5!d' naidis.txt

Viimase rea kustutamine

Soovides kustutada ainult viimast rida:

sed ’$d’ naidis.txt

Kustutamisel tühikuga asendamine

Eeltoodud näidete puhul kustutati terve rida, kuid teinekord on vaja kustutada vaid sõne selles reas, jättes ülejäänud teksti alles. Selleks tarbeks saab kasutada käsku kujul:

sed 's/veasid//g' naidis.txt

Tulemuseks on kustutatud kõik eksisteerinud sõned "veasid" ja asendatud need tühikuga.

Muutmine

Käsureal jooksvalt faili muutmine

Selleks tuleb anda käsk

sed -i -e 'sedi käsud' failinimi

Näiteks asendame failis kõik sõned "esimene", sõnega "teine".

sed -i -e 's/esimene/teine/g' naidis.txt

Teatud ridade muutmine

Asendame failis sõne "on" sõnega "ei ole" igal real, kus see sõne sisaldub.

sed '/see/s/on/ei ole/g' naidis.txt

Reavahede lisamine

Kahekordse reavahe lisamine:

sed 'G' failinimi

Kahekordse reavahe lisamine, kui failis olevas tekstis on vähemalt üks tühi rida:

sed '/^$/d;G' failinimi

Tühja rea tagasivõtmine (kustutamine), kui see tühi rida on paarisnumbriline:

sed 'n;d' failinimi

Tühja rea lisamine iga rea ette, mis sisaldab konkreetset sõne:

sed '/sõne/{x;p;x;}' failinimi

Tühja rea lisamine iga rea järele, mis sisaldab konkreetset sõne:

sed '/sõne/G' failinimi

Tühja rea lisamine nii iga rea ette kui ka järele, mis sisaldab konkreetset sõne:

sed '/sõne/{x;p;x;G;}' failinimi

Ridade nummerdamine

Iga rea ette tekstiga samale reale reanumbri lisamine:

sed = failinimi | sed 'N;s/\n/\t/'

Järgmine käsk nummerdab samuti ridu failis, kuid reanumbrid tekivad tekstireale eelnevale reale:

sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'

Järgmine käsk nummerdab samuti ridu failis ja reanumbrid tekivad tekstireale samale reale, kuid kui rida on tühi, siis sinna ette reanubmrit ei prindita:

sed '/./=' filename | sed '/./N; s/\n/ /'

Lõpetamine

Sedile on võimalik käsuga q (ingl. k. quit) öelda, et ta teatud tingimusel lihtsalt lõpetaks ja ei täidaks eelnevalt antud käsku.

sed '2 q'

Nimetatud käsk prindib 2 tühja rida (tuleb Enter klahvi 2 korda vajutada) ja väljub.

Sedi käsud ja võtmed

Käsk ja tulemus

  • a\ - aktiivse rea alla teksti lisamine
  • c\ - aktiivsel real teksti muutmine uue tekstiga
  • d - teksti kustutamine
  • i\ - aktiivse rea ette teksti lisamine
  • p - teksti printimine
  • r - faili lugemine
  • s - teksti otsimine ja asendamine
  • w - faili kirjutamine


Võtmed ja mõju

  • -e SCRIPT - käskude lisamine skripti käskude paketti sisendi töötlemise ajal töötamiseks
  • -f - käskude lisamine SCRIPT-FILE sisaldavatesse failide käskude paketti sisendi töötlemise ajal töötamiseks
  • -n - vaikne töörežiim
  • -V - versiooni informatsiooni printimine ja väljumine


Kasutatud materjal