FLOSS Manuals

 English |  Español |  Français |  Italiano |  Português |  Русский |  Shqip

Komentorivin perusteet

Sed

Sed-tekstiohjelmointikieli

Sed (sanoista "stream editor", virrankäsittely) on hyötyohjelma, joka tekee muutoksia rivi kerrallaan. Sille annetut komennot ajetaan jokaisella sisääntulon rivillä vuorollaan. Se on hyödyllinen sekä tiedostojen käsittelyyn että prosessin ulostulon putkittamiseen muihin ohjelmiin, kuten tässä:

$ wc -c * | sort -n | sed ...

Perussyntaksi ja korvaus

Yleinen tapa käyttää Sediä on sanojen vaihtaminen tiedoston sisällä. Olet voinut käyttää "etsi ja korvaa" -toimintoa graafisissa tekstinkäsittelyohjelmissa. Sed voi tehdä tämän paljon tehokkaammin ja nopeammin:

 $ sed "s/hölö/pölö/g" sisääntulotiedosto > ulostulotiedosto

Tutkitaanpa tätä yksinkertaista tiedostoa. Ensin kerromme komentotulkin ajaa komento sed. Tahtomamme käsittely on lainausmerkkien sisällä; palaamme tähän hetken päästä. Sen jälkeen kerromme Sedille sisääntulotiedoston ja käytämme komentotulkin uudelleensuuntausmerkkiä (>) nimetäksemme ulostulotiedoston. Voit määritellä tahtoessasi monta sisääntulotiedostoa; Sed käsittelee ne järjestyksessä ja luo niistä yhden ulostulovirran.

Tämä ilmaisu näyttää monimutkaiselta, mutta se on hyvin yksinkertainen, kunhan opit ymmärtämään sitä. Alussa oleva "s" merkitsee "korvaa" (englanniksi "substitute"). Tämä seuraa teksti, jonka tahdot löytää ja korvaava teksti, vinoviivat (/) toimivat erotusmerkkeinä. Niinpä Sedin täytyy löytää "hölö" sisääntulotiedostossa ja laittaa "pölö" sen tilalle. Vain ulostulotiedosto muuttuu; Sed ei koskaan muuta sisääntulotiedostoja.

Lopussa oleva "g" tarkoittaa "globaalia", mikä merkitsee, että tämä operaatio tehdään koko riville. Jos jätät pois merkin "g" ja "hölö" näkyy kaksi kertaa samalla rivillä, ainoastaan ensimmäinen "hölö" muutetaan muotoon "pölö".

$ cat testitiedosto
hölö pölö hölö pölö hölö pölö hölö pölö
$ sed "s/hölö/pölö/g" testitiedosto > muutettutestitiedosto
$ cat muutettutestitiedosto
pölö pölö pölö pölö pölö pölö pölö pölö

Kokeillaanpa tätä uudestaan ilman merkkiä /g komennossa ja katsotaan mitä tapahtuu.

$ cat testitiedosto
hölö pölö hölö pölö hölö pölö hölö pölö
$ sed "s/hölö/pölö/" testitiedosto > muutettutestitiedosto
$ cat muutettutestitiedosto
pölö pölö hölö pölö hölö pölö hölö pölö

Huomaa, että ilman merkkiä "g" Sed teki korvauksen vain ensimmäiseen löytämäänsä sopivaan sanaan jokaisella rivillä. 

Tämä kaikki on hienoa, mutta entäpä jos tahtoisit muuttaa testitiedostossa vasta toisen sanan hölö? Muuttaaksesi tietyn sanan ilmentymän joudut määrittelemään numeron korvauskomentojen jälkeen.

$ sed "s/hölö/pölö/2" sisääntulotiedosto > ulostulotiedosto 

Voit myös yhdistää tämän lippuun g (joissain Sedin versiossa) jättääksesi ensimmäisen ilmentymän entiselleen ja muuttaaksesi kaikki ilmentymät toisesta viimeiseen riviin asti. 

$ sed "s/hölö/pölö/2g" sisääntulotiedosto > ulostulotiedosto

Sed-ilmaisut selitettynä

Sed ymmärtää säännöllisiä lauseita, joita käsittelee kokonainen luku tässä kirjassa. Tässä on joitain erikoismerkeistä, joita voit käyttää sopimaan siihen, mitä tahdot korvata.

$ sopii rivin loppuun
^ sopii rivin alkuun
* sopii nollaan tai useampaan kappaleeseen edellistä merkkiä
[ ] kaikki hakasulkujen sisällä olevat merkit sovitetaan

Voisit esimerkiksi muuttaa sanat "cat", "can" ja "car" sanaan "dog" tekemällä seuraavan:

 $ sed "s/ca[tnr]/dog/g" sisääntulotiedosto > ulostulotiedosto

Poista mikä tahansa numerosarja. Ensinnäkin [0-9] varmistaa, että tarvitaan ainakin yksi numero sovitettavaksi. Seuraava [0-9] voidaan poistaa tai se voi olla peräkkäin miten tahansa monta kertaa, koska sitä seuraa metamerkki *. Lopulta numerot poistetaan, koska toisen ja kolmannen kauttaviivan välillä ei ole mitään, vaikka voisit laittaa siihen korvaavan tekstin. 

 $ sed "s/[0-9][0-9]*//g" sisääntulotiedosto > ulostulotiedosto

Jos ensimmäinen merkki ilmaisun siällä on tarke (^), Sed sovittaa ainoastaan, mikäli teksti on rivin alussa.

$ echo dogs cats and dogs | sed "s/^dogs/doggy/"
doggy cats and dogs

Dollarimerkki merkkijonon lopussa käskee Sedin sovittaa teksti ainoastaan, mikäli se on rivin lopussa.

$ echo dogs cats and cats | sed "s/cats$/kitty/"
dogs cats and kitty

Rivi muuttuu vain, jos sovitettava merkkijono on siellä, missä vaadit sen olevan, jos sama teksti on jossain muualla lauseessa, sitä ei muuteta.

Poistaminen

Komento "d" poistaa kokonaisen rivin, jossa on sopiva merkkijono. Toisin kuin komento "s" komento "d" ottaa koko rivin.

$ cat testitiedosto
line with a cat
line with a dog
line with another cat
$ sed "/cat/d" testitiedosto > uusitestitiedosto
$ cat uusitestitiedosto
line with a dog

Säännöllinen lause ^$ merkisee "sovita rivi, jossa ei ole mitään alun ja lopun välissä", toisin sanottuna, tyhjä rivi. Voit poistaa kaikki tyhjät rivit käyttäen komentoa "d" tuon säännöllisen lauseen kanssa:

$ sed "/^$/d" sisääntulotiedosto > ulostulotiedosto

Tulostuksen hallinta

Oletetaanpa, että tahdot tulostaa joitain rivejä ja jättää loput tulostamatta. Sen sijaan että poistaisit rivit komennolla "d" voitkin määritellä, mitkä rivit pidetään.

Tämä voidaan tehdä kahdella ominaisuudella:

Määrittele valitsin -n, joka merkitsee "älä tulosta rivejä oletusarvoisesti".

Lopeta merkkijono merkillä "p" tulostaaksesi rivin, joka sopii merkkijonoon.

Näytämme tämän tiedoston, joka sisältää nimiä:

$ cat testitiedosto
Mr. Jones
Mrs. Jones
Mrs. Lee                                                                        Mr. Lee

Olemme päättäneen käyttää aina "Ms" naisille, joten tahdomme muuttaa "Mrs." merkkijonoksi "Ms". Säännöllinen lauseke on:

 s/Mrs\./Ms/

ja tulostaaksemme ainoastaan muutetut rivit, kirjoitamme: 

$ sed -n "s/Mrs\./Ms/p" testfile

Monta hahmoa

Sedille voidaan laittaa useampia kuin yksi operaatio samaan aikaan. Voimme tehdä tämän määrittelemällä jokaisen hahmon valitsimen -e jälkeen.

$ echo Gnus eat grass | sed -e "s/Gnus/Penguins/" -e "s/grass/fish/"
Penguins eat fish.

Muokkausten hallinta hahmoilla

Voimme myös olla tarkempia siitä, mihin riveihin hahmoja sovelletaan. Tarjoamalla hahmoa ennen operaatiota voit rajoittaa operaation riveihin, joilla on kyseinen hahmo.

$ cat testitiedosto
one: number
two: number
three: number
four: number
one: number
three: number
two: number
$ sed "/one/ s/number/1/" testitiedosto > muutettutestitiedosto
$ cat muutettutestitiedosto
one 1
two: number
three: number
four: number
one: 1
three: number
two: number

Komento sed sai tässä esimerkissä kaksi hahmoa. Ensimmäinen hahmo, "one", hallitsee yksinkertaisesti Sedin muuttamia rivejä. Toinen hahmo korvaa merkkijonon "number" numerolla "1" noilla riveillä.

Tämä toimii myös useampien hahmojen kanssa.

$ cat testitiedosto
one: number
two: number
three: number
four: number
one: number
three: number
two: number
$ sed -e "/one/ s/number/1/" -e "/two/ s/number/2/" \
 -e "/three/ s/number/3/" -e "/four/ s/number/4/" \
 < testitiedosto > muutettutestitiedosto
$ cat muutettutestitiedosto
one: 1
two: 2
three: 3
four: 4
one: 1
three: 3
two: 2

Muokkausten hallinta rivinumeroiden avulla

Sen sijaan että määrittäisit hahmoja, jotka voivat toimia millä tahansa rivillä, voimme määritellä tarkan rivin tai rivejä muokattavaksi.

$ cat testitiedosto
even number
odd number
odd number
even number
$ sed "2,3 s/number/1/" < testitiedosto > muutettutestitiedosto
$ cat muutettutestitiedosto
even number
odd 1
odd 1
even number

Tämä pilkku toimii erottimena, joka käskee Sedin toimia vain riveillä kaksi ja kolme.

$ cat testitiedosto
even number
odd number
odd number
$ sed -e "2,3 s/number/1/" -e "1 s/number/2/" < testitiedosto > muutettutestitiedosto
$ cat muutettutestitiedosto
even 2
odd 1
odd 1

Joskus et tiedä tarkalleen kuinka pitkä tiedosto on, mutta tahdot mennä määritellyltä riviltä tiedoston loppuun. Voit käyttää komentoa wc tai vastaavaa ja laskea rivien kokonaismäärän, mutta voit käyttää myös dollarimerkkiä ($) edustamaan viimeistä riviä: 

$ sed "25,$ s/number/1/" < testitiedosto > muutettutestitiedosto

Dollarimerkki $ on Sedin tapa sanoa: "rivin loppuun asti".

Sed-komentojen skriptaaminen

Käyttämällä valitsinta -f Sed-komennossa, voit syöttää Sedille listan komennoista, joita se voi ajaa. Voit esimerkiksi laittaa seuraavat hahmot tiedostoon, jonka nimi on sedkomennot:

s/foo/bar/g
s/dog/cat/g
s/tree/houseg/
s/little/big/g

Voit tehdä tämän yhteen tiedostoon kirjoittamalla seuraavan komennon:

$ sed -f sedkomennot < sisääntulotiedosto > ulostulotiedosto

Jokaisen tiedostossa olevan komennon täytyy olla eri rivillä.

Sedin kaikkia ominaisuuksia ei voida kuvata tässä luvussa. Itse asiassa Sedistä on kirjoitettu kokonaisia kirjoja, verkossa on monia loistavia oppaita Sedin käyttöön.

There has been error in communication with Booktype server. Not sure right now where is the problem.

You should refresh this page.