Ero sivun ”Sed” versioiden välillä
(y/// ja s###) |
(Lisätty komentoja) |
||
Rivi 16: | Rivi 16: | ||
===Sed-lausekkeet=== | ===Sed-lausekkeet=== | ||
Tyypillisin sed- | Sed-lausekkeet ovat yksinkertaisimmillaan muotoa | ||
[osoite] <komento>[ | |||
teksti] | |||
jossa [[#Osoitteet|osoite]] kertoo ne rivit johin [[#Komennot|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==== | |||
Osoitteita ovat mm.: | |||
*''<numero>'' rivinumero; kometoa sovelletaan riviin numero ''numero''. | |||
::Esimerikiksi.: | |||
$ sed '11 [[#c, rivin korvaus|c]]\ | |||
Yhdestoista rivi.' <tiedosto> | |||
:: Korvaa 11. rivin tekstillä "Yhdestoista rivi." | |||
*$ tiedoston loppu; komentoa sovelletaan viimeisen rivin jälkeen | |||
::Esimerikiksi.: | |||
$ sed '$ [[#a, rivin lisäys nykyisen rivin jälkeen|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, rivin poisto|d]]' <tiedosto> | |||
:: Poistaa kaikki rivit, jotka alkavat #-merkillä. | |||
====Komennot==== | |||
=====s, rivin muokkaaminen===== | |||
Tyypillisin sed-komento lienee epäilemättä '''s''': | |||
s/<korvattava lauseke>/<korvaava lauseke>/g | s/<korvattava lauseke>/<korvaava lauseke>/g | ||
Sedissa s/// siis korvaa yksittäisia [[wikipedia:fi:merkkijono|osamerkkijonoja]] toisilla, g perässä kertoo, että kaikki vastaavuudet korvataan, eikä vain rivin ensimmäistä. Tätä samaa korvaussyntaksia käyttää mm. [[vim]]. | Sedissa s/// siis korvaa yksittäisia [[wikipedia:fi:merkkijono|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 | Käsiteltäessä vaikkapa hakemistopolkuja voidaan välimerkki valita toisin | ||
s#/root/tmp#/tmp#g | s#/root/tmp#/tmp#g | ||
Korvaamisen lisäksi syötteelle voidaan tehdä [[tr]]-komentoa mukaileva käännös, joka muuntaa yksittäisiä merkkejä | =====y, translitterointi===== | ||
echo 'kaarteessa kahlaajat' | sed 'y/ | Korvaamisen lisäksi syötteelle voidaan tehdä [[tr]]-komentoa mukaileva käännös, joka muuntaa yksittäisiä merkkejä. | ||
Tulosteeksi tulisi " | 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===== | |||
<osoite> d | |||
Poistaa rivit joihin osoite sopii. Esimerkki: | |||
$ sed '3 d' <tiedosto> | |||
Poistaa tiedoston kolmannen rivin. | |||
=====c, rivin korvaus===== | |||
<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ä===== | |||
<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===== | |||
<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ä=== | ||
echo ababaabcd | sed -e 's/\(ab\)*//' | echo ababaabcd | sed -e 's/\(ab\)*//' | ||
tulostaa "abaabcd". Vastaavasti g:n kanssa | tulostaa "abaabcd". Vastaavasti g:n kanssa |
Versio 11. elokuuta 2014 kello 13.16
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ö
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
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 '<sed-lauseke>' -e '<sed-lauseke>'
Sed-lausekkeet
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
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ä.
Komennot
s, rivin muokkaaminen
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
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
<osoite> d
Poistaa rivit joihin osoite sopii. Esimerkki:
$ sed '3 d' <tiedosto>
Poistaa tiedoston kolmannen rivin.
c, rivin korvaus
<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ä
<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
<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ä
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