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