Sed

Linux.fista
Versio hetkellä 5. huhtikuuta 2020 kello 18.09 – tehnyt Javali (keskustelu | muokkaukset) (kaikkilla sed-lausekkeilla tulee olla -e vipu)
(ero) ← Vanhempi versio | Nykyinen versio (ero) | Uudempi versio → (ero)
Siirry navigaatioon Siirry hakuun

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".
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

Katso myös[muokkaa]

Aiheesta muualla[muokkaa]