Sed: Difference between revisions
No edit summary |
No edit summary |
||
(19 intermediate revisions by the same user not shown) | |||
Line 7: | Line 7: | ||
'''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]. | '''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]. | ||
Sedi töötamise põhimõte on: Sed võtab sisendvoost andmed, töötleb neid vastavalt etteantud korraldusele ja kirjutab tulemuse väljundisse. | |||
See | |||
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. | 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. | ||
Line 15: | Line 18: | ||
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. | 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== | ==Spetsiaalne tähemärk== | ||
Line 100: | Line 41: | ||
[[File:algtekst.png]] | [[File:algtekst.png]] | ||
Tekstifailis naidis.txt näiteks esimese 3 rea kuvamine: | |||
<pre>sed '3q' naidis.txt</pre> | <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: | ||
Line 118: | Line 57: | ||
==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) | 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> | ||
Line 127: | Line 66: | ||
<pre>sed -n '/veasid/p' naidis.txt</pre> | <pre>sed -n '/veasid/p' naidis.txt</pre> | ||
==Ridade valik== | ==Ridade valik== | ||
Line 172: | Line 109: | ||
[[File:asendus1.png]] | [[File:asendus1.png]] | ||
Antud juhul see tulemus ei rahulda, sest | 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</pre> | <pre>sed 's/veasid/vigu/g' naidis.txt</pre> | ||
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 186: | Line 121: | ||
Tihti on kasulik muudatustega read salvestada uude faili. | Tihti on kasulik muudatustega read salvestada uude faili. | ||
<pre>sed -n 's/veasid/vigu/pg' naidis.txt >uus.txt</pre> | <pre>sed -n 's/veasid/vigu/pg' naidis.txt >uus.txt</pre> | ||
==Adresseerimine (lisamine)== | ==Adresseerimine (lisamine)== | ||
Line 268: | Line 193: | ||
===Ridade vahemiku kustutamine=== | ===Ridade vahemiku kustutamine=== | ||
Kustutame | Kustutame näitefailis vigu sisaldavad read (3. ja 4. rida), selleks tuleb kasutada käsku: | ||
<pre>sed | <pre>sed '3,4d' naidis.txt</pre> | ||
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=== | ===Kustutamine konkreetsest sõnest konkreetse sõneni=== | ||
Line 379: | Line 302: | ||
Nimetatud käsk prindib 2 tühja rida (tuleb Enter klahvi 2 korda vajutada) ja väljub. | 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= | =Kasutatud materjal= | ||
* Unix and Linux, Sed Tutorial, | * Unix and Linux, Sed Tutorial, http://www.panix.com/~elflord/unix/sed.html<br/> | ||
* Sed - An Introduction and Tutorial, | * Sed - An Introduction and Tutorial, http://www.grymoire.com/Unix/Sed.html<br/> | ||
* Linuxtopia, | * Linuxtopia, http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_05_02.html<br/> | ||
* Zytrax Communications, | * Zytrax Communications, http://zytrax.com/tech/web/regex.htm<br/> | ||
* Bash-Beginners-Guide, | * Bash-Beginners-Guide, http://tldp.org/LDP/Bash-Beginners-Guide/html/chap_05.html<br/> | ||
* Doctor Bob's Lowfat Linux, | * Doctor Bob's Lowfat Linux, http://lowfatlinux.com/linux-sed.html<br/> | ||
* sed FAQ, version 014, | * sed FAQ, version 014, http://www.faqs.org/faqs/editor-faq/sed/<br/> | ||
* Wikipedia | * Wikipedia, http://en.wikipedia.org/wiki/Sed<br/> | ||
* USEFUL ONE-LINE SCRIPTS FOR SED | * 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
- Unix and Linux, Sed Tutorial, http://www.panix.com/~elflord/unix/sed.html
- Sed - An Introduction and Tutorial, http://www.grymoire.com/Unix/Sed.html
- Zytrax Communications, http://zytrax.com/tech/web/regex.htm
- Bash-Beginners-Guide, http://tldp.org/LDP/Bash-Beginners-Guide/html/chap_05.html
- Doctor Bob's Lowfat Linux, http://lowfatlinux.com/linux-sed.html
- sed FAQ, version 014, http://www.faqs.org/faqs/editor-faq/sed/
- Wikipedia, http://en.wikipedia.org/wiki/Sed
- USEFUL ONE-LINE SCRIPTS FOR SED http://sed.sourceforge.net/sed1line.txt