Sed
Sed eli Stream Editor on tiedostojen ja syötevirtojen yksinkertaiseen automaattiseen muokkaamiseen tarkoitettu ohjelma ja tavallaan myös kieli. Kuten useimmista muistakin peruskomentorivityökaluista, tästäkin on useita toteutuksia.
Käyttö[muokkaa]
Tyypillisin käyttötapa on komentotulkin putkitusominaisuutta käytettävä muoto
<tulostava komentolauseke> | sed -e "<sed-lauseke>"
Sed kykenee muokkaamaan myös tiedostoja
sed -i <muokattava-tiedosto>
Sedin ohjaaminen[muokkaa]
Sed vastaanottaa muokkaustemplaatin joko tiedostona
sed -f <skriptitiedosto>
tai komentoriviargumenttina
sed '<sed-lauseke>'
Lausekkeita voi suoritusnopeutta ajatellen ketjuttaa ohjelman useamman käynnistämisen välttämiseksi
sed -e '<sed-lauseke>' -e '<sed-lauseke>'
Sed-lausekkeet[muokkaa]
Sed-lausekkeet ovat yksinkertaisimmillaan muotoa
[osoite] <komento>[ teksti]
jossa osoite kertoo ne rivit johin komentoa sovelletaan. Osoitteen voi jättää poiskin jolloin komento toteutetaan kaikille riveille. Komennolle mahdollisesti annettava teksti kirjojitetaan komennon ja rivinvaihdon jälkeen.
Esimerkki:
$ sed '5 i\ uusi rivi' tiedosto
Esimerkissä 5 on osoite (rivinumero) i on komento (rivin lisäys ennen nykyistä riviä), jota seuraa komennon parametri (lisättävä rivi).
Osoitteet[muokkaa]
Osoitteita ovat mm.:
- <numero> rivinumero; kometoa sovelletaan riviin numero numero.
- Esimerikiksi.:
$ sed '11 c\ Yhdestoista rivi.' <tiedosto>
- Korvaa 11. rivin tekstillä "Yhdestoista rivi."
- $ tiedoston loppu; komentoa sovelletaan viimeisen rivin jälkeen
- Esimerikiksi.:
$ sed '$ a\ Päivä pulkassa' <tiedosto>
- Lisää tiedoston viimeisen rivin jälkeen rivn "Päivä pulkassa".
- /regex/ komentoa sovelletaan kaikkiin riveihin, joihn säännöllinen lauseke sopii
- Esimerikiksi.:
$ sed '/^#/ d' <tiedosto>
- Poistaa kaikki rivit, jotka alkavat #-merkillä.
Kaksi osoitetta voi erottaa pilkulla, jolloin komentoa sovelletaan ensimmäiseen ja viimeiseen osoitteeseen mätsääviin riveihin ja kaikkiin niiden välisiin:
$ sed '/^Poistettava loppukirjoitus:\s*$/,$ d' <tiedosto>
- Poistaa kaikki rivit rivistä "Poistettava loppukirjoitus:" alkaen tiedoston loppuun.
Komennot[muokkaa]
s, rivin muokkaaminen[muokkaa]
Tyypillisin sed-komento lienee epäilemättä s:
s/<korvattava lauseke>/<korvaava lauseke>/g
Sedissa s/// siis korvaa yksittäisia osamerkkijonoja toisilla, g perässä kertoo, että kaikki vastaavuudet korvataan, eikä vain rivin ensimmäistä. Tätä samaa korvaussyntaksia käyttää mm. vim.
Käsiteltäessä vaikkapa hakemistopolkuja voidaan välimerkki valita toisin
s#/root/tmp#/tmp#g
y, translitterointi[muokkaa]
Korvaamisen lisäksi syötteelle voidaan tehdä tr-komentoa mukaileva käännös, joka muuntaa yksittäisiä merkkejä.
y/<korvattavat merkit>/<korvaavat merkit>/
Korvattava merkit korvataan vastaavalla korvaavalla merkillä.
echo 'kaarteessa kahlaajat' | sed 'y/ae/io/'
Tulosteeksi tulisi "kiirtoossi kihliijit".
d, rivin poisto[muokkaa]
<osoite> d
Poistaa rivit joihin osoite sopii. Esimerkki:
$ sed '3 d' <tiedosto>
Poistaa tiedoston kolmannen rivin.
c, rivin korvaus[muokkaa]
<osoite> c\ <korvaava rivi>
Korvaa rivit joihin <osoite> sopii rivillä '<korvaava rivi>'. Esimerkki:
$ sed '/peruna/ c\ RIVI POISTETTU YLEISEN TURVALLISUUDEN NIMESSÄ' <tiedosto>
Korvaa rivit, jotka sisältävät tekstin "peruna" tekstillä "RIVI POISTETTU YLEISEN TURVALLISUUDEN NIMESSÄ".
i, rivin lisäys ennen nykyistä riviä[muokkaa]
<osoite> i\ <uusi rivi>
Lisää rivin <uusi rivi> ennen niitä rivejä, joihin <osoite> sopii. Esimerkki:
$ sed '1 i\ Eka!' <tiedosto>
Lisää rivin "Eka!" tiedoston ensimmäiseksi riviksi.
a, rivin lisäys nykyisen rivi jälkeen[muokkaa]
<osoite> a\ <uusi rivi>
Lisää rivin <uusi rivi> niiden rivien jälkeen joihin <osoite> sopii. Esimerkki:
$ sed '1 a\ Toinen rivi' <tiedosto>
Lisää rivin "Toinen rivi" tiedoston toiseksi riviksi.
Muita esimerkkejä[muokkaa]
echo ababaabcd | sed -e 's/\(ab\)*//'
tulostaa "abaabcd". Vastaavasti g:n kanssa
echo ababaabcd | sed -e 's/\(ab\)*//g'
tulostaa "acd", tässä * on kuitenkin turha, koska g vastaa saman lausekkeen mielivaltaisen monta kertaa.
sed -i 's/vanha/uusi/' *.py
vaihtaa sanan "vanha" sanaan "uusi" kaikissa kyseisen hakemiston py-tiedostoissa