Linuxin 'sed'-komento tarkoittaa stream-editoria. Sitä käytetään virtojen (tiedostojen) muokkaamiseen säännöllisten lausekkeiden avulla. Mutta tämä muokkaus ei ole pysyvää. Se jää vain näytölle, mutta todellisuudessa tiedoston sisältö pysyy samana.
Ensisijaisesti sitä käytetään tekstin korvaamiseen; Lisäksi sitä voidaan käyttää muihin tekstinkäsittelytoimintoihin, kuten lisäämiseen, poistamiseen, hakuun ja muihin. Sed-komennon avulla voimme muokata tiedostoja avaamatta niitä. Säännöllisen lausekkeen tuki tekee siitä tehokkaamman tekstinkäsittelytyökalun.
Yleiskatsaus sed-komennosta
Se on Unix-apuohjelma, joka muuntaa ja jäsentää tekstiä kompaktilla ja yksinkertaisella ohjelmointikielellä. Sen integroi vuosina 1973–1974 Lee E. McMahon Bell Labsista, ja se on nykyään lähes kaikissa käyttöjärjestelmissä. Sed-komento perustui aikaisemman qed:n (pikaeditorin) ja ed-vuorovaikutteisen editorin komentosarjanäkökohtiin. Se oli varhaisin työkalu säännöllisten lausekkeiden tukemiseen, ja se pysyy aktiivisena tekstinkäsittelyssä, mikä tärkeintä korvauskomennon kanssa. Kuuluisia vaihtoehtoisia työkaluja ovat Perl ja AWK for 'stream editointi' ja selväkielisten merkkijonojen käsittely.
sed-komennon toimintatila
Sed-komento on tekstinkäsittelyn rivisuuntautunut apuohjelma: se rivi riviltä lukee tekstiä tiedostosta tai syöttövirrasta sisäiseen puskuriin, joka tunnetaan nimellä kuviotila. Kaikki rivin lukemat aloittavat syklin. sed-komento käyttää yhtä tai useampaa toimintoa, jotka on kuvattu sed-komentosarjalla kuviotilaan. Se käyttää ohjelmointikieltä käyttämällä noin 25 komentoa, jotka kuvaavat tekstin päällä tapahtuvia toimintoja.
Kaikilla syöttöriveillä sed-komento johtaa tavallisesti kuviotilaan ja aloittaa syklin uudelleen seuraavalla rivillä komentosarjan suorittamisen jälkeen. Muita skriptin lopun tyyppejä on saatavana komentosarjakomennoista ja asetusvaihtoehdoista, esim. N, joka lisää seuraavan rivin välittömästi kuviotilaan, q lopettaa, d poistaa kuviotilan ja niin edelleen. Siten sed-komentosarja liittyy silmukan runkoon, joka iteroituu virtaviivasta, jossa sed ylläpitää ja implisiittistä silmukkamuuttujaa ja itse silmukkaa.
- Sed-skripti voidaan joko kuvata komentorivillä tai lukea erillisen tiedoston kautta. Sed-skriptissä komennot voivat ottaa ylimääräisen osoitteen säännöllisten lausekkeiden tai rivinumeroiden yhteydessä. Osoite päättää, milloin komento suoritetaan. Esimerkiksi 2d suorittaa vain d-komennon (tai poista) toisella syöttörivillä, kun taas /^ /d poistaa kaikki välilyönnillä alkavat rivit.
- Jotkin sed-komennot voivat käyttää pitotilaa, eristettyä erikoispuskuria, keräävän tekstin säilyttämiseen syklien välillä. Sedin komentokielessä on vain kaksi muuttujaa (mallitila ja pitoväli) sekä GOTO-tyyppinen haaroitustoiminto. Kieli on kuitenkin Turing-täydellinen. Esoteeriset sed-skriptit ovat saatavilla useisiin peleihin, kuten tetris, shakki, arkanoid ja sokoban.
- Pääsilmukka suoritetaan kaikilla tulovirran riveillä ja tarkistaa sed-komentosarjan kaikilla tulon riveillä. Sed-skriptirivit ovat kaikki malli-toiminto-pari, joka edustaa, mitä mallia sovitetaan ja mikä toiminto tulee toteuttaa, mikä voidaan kopioida ehdollisena lauseena. Oletustoiminnot (tulostuskuviotila, rivin kopioiminen kuviotilaan), syöttö- ja tulostusvirrat sekä työmuuttujat (pitotila ja kuviotila) ovat implisiittisiä; Pääsilmukan vuoksi on mahdollista määrittää tiiviitä yksilinjaisia ohjelmia.
sed-komennon käyttö
- Caret (^) on sama kuin rivin alku.
- Dollarisymboli ($) on sama kuin rivin loppu.
- Tähti (*) on sama kuin enemmän tai nolla edellinen merkki.
- Plussymboli (+) on sama kuin yhden tai useamman edellisen merkin esiintyminen.
- Kysymysmerkki (?) on sama kuin enemmän tai nolla edellinen merkki.
- Pistesymboli (.) on täsmälleen sama kuin yksi merkki.
Alla oleva esimerkki edustaa sed-komennon yleisintä komentoa ja tyypillisintä käyttöä, eli korvaamista. Käyttö oli sed-komennon todellinen motiivi:
sed 's/regexp/replacement/g' inputFileName > outputTiedostonimi
Myös muut tavat ovat mahdollisia yksinkertaiseen käsittelyyn noin 25 sed-komennolla. Esimerkiksi alla käytetään d-vaihtoehtoa suodattamaan pois rivit, jotka sisältävät vain välilyöntejä ja rivin merkin loppua:
sed '/^ *$/d' inputFileName
Yllä oleva esimerkki käyttää muutamia alla olevista säännöllisen lausekkeen metamerkkeistä:
Usein sed-komentoa käytetään suodattimena liukuhihnan sisällä Unixissa:
$generateData | sed 's/x/y/g'
GeneratorData-ohjelma luo dataa, ja sed-komento tekee pienen muutoksen korvaamalla x:n y:n tilalle.
Usein on hyödyllistä laittaa useita sed-komentoja, yksi komento jokaiselle riville, skriptitiedoston sisään ja käyttää -f-lippua komentojen suorittamiseen tiedostosta:
sed -f subst.sed inputFileName > outputFileName
Syntaksi:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
Vaihtoehdot:
Seuraavassa on joitain sed-komennon komentorivivaihtoehtoja:
-n, --hiljainen, --hiljainen: Sen avulla voimme painaa kuviotilaa voimakkaasti.
-e script, --expression=script: Sitä käytetään lisäämään komentosarja suoritettaviin komentoihin.
-f script-file, --file=script-file: Sitä käytetään lisäämään script-tiedoston sisältö suoritettaviin komentoihin.
--follow-symlinks: sitä käytetään symbolilinkkien seuraamiseen paikan päällä tapahtuvan käsittelyn yhteydessä.
-i[SUFFIX], --in-place[=SUFFIX]: sitä käytetään tiedostojen muokkaamiseen paikallaan (luo varmuuskopion, jos SUFFIX-vaihtoehto on toimitettu).
-l N, --rivin pituus=N: Sitä käytetään määrittämään l-komennon haluttu rivinvaihtopituus.
--posix: sitä käytetään kaikkien GNU-laajennusten poistamiseen käytöstä.
-E, -r, --regexp-extended: Sen avulla voimme käyttää laajennettuja säännöllisiä lausekkeita komentosarjassa (siirrettävyyden vuoksi käytä POSIX -E).
-s, --erillinen: sitä käytetään tiedostojen pitämiseen erillisinä eikä yksittäisinä ja se jatkaa pitkää streamia.
--hiekkalaatikko: Sitä käytetään toimimaan hiekkalaatikkotilassa.
jotain nopeaa lajittelua
-u, --puskuroimaton: Sitä käytetään lataamaan mahdollisimman vähän dataa syöttötiedostoista ja huuhtelee tulostuspuskurit useammin.
-z, --null-data: Sitä käytetään rivien erottamiseen NUL-merkeillä.
--auta: sitä käytetään ohjeoppaan näyttämiseen.
--versio: Sitä käytetään versiotietojen näyttämiseen.
Esimerkkejä sed-komennosta
Katsotaanpa seuraavia esimerkkejä:
- Hakeminen STDIN-hakemistoon
- Globaali korvaus
- Viivan poistaminen
- Multiple sed -komennon käyttäminen
- Komentojen lukeminen tiedostosta
- Hahmojen korvaaminen
- Rajoitetaan sed
- Tekstin lisääminen ja liittäminen
- Linjojen muokkaaminen
- Hahmojen muuntaminen
- Rivinumeroiden tulostaminen
Hakeminen STDIN-hakemistoon
sed-komento ei rajoitu vain tiedostojen käsittelyyn; voimme myös käyttää sitä STDIN-hakemistoon.
echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/'
Yllä olevat komennot korvaavat ensimmäisen tekstin toisella tekstikuviolla. Harkitse alla olevaa tulosta:
Yllä olevasta lähdöstä olemme ensin suorittaneet 'sed'-komennon merkkijonolle 'class7', jossa 'class' muutetaan 'jtp':ksi ja 7 10:ksi. Sitten olemme suorittaneet 'sed'-komennon virralle 'msg.txt ' jossa 'oppia' muunnetaan sanaksi 'study'.
Globaali korvaus
Aiemmassa esimerkissä kaikkia 'oppia'-sanoja ei muokattu sanaksi 'study'. Jokaista sanaa muokataksemme meidän on käytettävä globaalia korviketta 'g'. Se muokkaa kaikkia määritettyjä sanoja tiedostossa tai merkkijonossa.
Syntaksi:
command | sed 's///g'
Harkitse alla olevia esimerkkejä:
echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g'
Yllä olevat komennot korvaavat kaikki määritetyt tekstimallit. Harkitse alla olevaa tulosta:
Yllä olevasta lähdöstä suorittamalla komennon 'echo class7 class9 | sed 's/class/jtp/g' kaikki 'luokka' muunnetaan 'jtp':ksi ja komennolla 'cat msg.txt | sed 's/learn/study/g' kaikki 'learn' muutettiin 'study'ksi.
Viivan poistaminen
d-vaihtoehto antaa meille mahdollisuuden poistaa tiedostosta koko rivin. Meidän tarvitsee vain määrittää sana kyseiseltä riviltä d-vaihtoehdolla, ja tämä rivi poistetaan. Huomaa kuitenkin, että kaikki rivit, joilla on sama sana, poistetaan. Se suoritetaan seuraavasti:
cat | sed '//d'
Harkitse alla olevaa komentoa:
mikä on lepotila
cat msg.txt | sed '/jtp/d'
Yllä oleva komento poistaa rivit, joissa on sana 'jtp'. Harkitse alla olevaa tulosta:
Yllä olevasta lähdöstä suorittamalla komennon 'cat msg.txt | sed '/jtp/d' kaikki sanan jtp sisältävät rivit poistetaan.
Multiple sed -komennon käyttäminen
'-e' -vaihtoehto antaa meille mahdollisuuden suorittaa useita sed-komentoja kerralla. Voimme suorittaa useamman kuin yhden sed-operaation suorittamalla komennon seuraavasti:
sed -e ' ; '
Harkitse alla olevaa komentoa:
sed -e 's/red/blue/; s/yellow/black/' exm.txt
Yllä oleva komento käyttää kaikkia tiedostossa 'exm.txt' määritettyjä toimintoja. Harkitse alla olevaa tulosta:
Kuten yllä olevasta tuloksesta näemme, kaikki 'punaiset' sanat korvataan 'sinisellä' ja kaikki 'keltaiset' sanat 'mustilla'. Voimme myös erottaa komennot seuraavasti:
sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt
Tulos on sama kuin yllä oleva komento.
Komentojen lukeminen tiedostosta
Voimme tallentaa sed-komennot tiedostoon ja käyttää niitä kerralla missä tahansa tiedostossa. Se voidaan tehdä määrittämällä '-f' -vaihtoehto seuraavasti:
sed -f
Yllä olevasta komennosta '' on tiedosto, jossa on sed-komentoluettelo. Harkitse alla olevaa komentoa:
sed -f SedCommands exm.txt
Yllä oleva komento käyttää kaikkia exm.txt-tiedoston SedCommand-tiedostossa määritettyjä komentoja. Harkitse alla olevaa tulosta:
Yllä olevasta lähdöstä olemme käyttäneet aikaisempaan esimerkkiin sovellettuja komentoja. Tulos on siis sama kuin edellisessä esimerkissä.
Hahmojen korvaaminen
Voimme käyttää huutomerkkiä (!) merkkijonon erottimena. Haluamme esimerkiksi korvata bash-kuoren ja korvata sen csh-kuorella hakemistossa '/etc/passwd'. Voit tehdä tämän suorittamalla alla olevan komennon:
sed 's//bin/bash//bin/csh/' /etc/passwd
Voimme saavuttaa saman tuloksen suorittamalla alla olevan komennon:
sed 's!/bin/bash!/bin/csh!' /etc/passwd
Rajoitetaan sed
sed-komennon peruskäyttö käsittelee koko tiedoston. Mutta voimme rajoittaa sed-komentoa ja määrittää minkä tahansa rivin. On kaksi tapaa rajoittaa sed-komentoa:
- Erilaisia rivejä.
- Kuvio, joka vastaa tiettyä riviä.
Voimme antaa numeron rivin määrittämiseksi seuraavasti:
sed '3s/Red/Blue/' exm.txt
Yllä oleva komento käyttää määritettyä toimintoa kolmannella rivillä. Harkitse alla olevaa tulosta:
Android-versiohistoria
Yllä olevasta lähdöstä vain riviä kolme muutetaan.
Voimme myös määrittää rivialueen. Jos haluat määrittää rivialueen, suorita komento seuraavasti:
sed '1,3s/Red/Blue/' exm.txt
Yllä oleva komento päivittää määritetyn tekstin riveillä 1 ja 3. Harkitse alla olevaa tulosta:
Tekstin lisääminen ja liittäminen
'i'- ja 'a'-lippuja käytetään tekstin lisäämiseen ja liittämiseen tiedostoon. Lippu 'i' lisää tekstin ennen merkkijonoa, ja 'a'-merkkiä käytetään tekstin lisäämiseen merkkijonon jälkeen. Harkitse alla olevaa komentoa:
echo 'Another Demo' | sed 'iFirst Demo'
Yllä oleva komento lisää tekstin ennen tekstiä 'Toinen esittely'. Harkitse alla olevaa tulosta:
Liitä tekstiä suorittamalla komento seuraavasti:
echo 'Another Demo' | sed 'aFirst Demo'
Yllä oleva komento liittää tekstin. Harkitse alla olevaa tulosta:
Linjojen muokkaaminen
'c'-lippua käytetään tietyn rivin muokkaamiseen. Jos haluat muokata riviä, suorita komento seuraavasti:
sed '3cThis is a modified line.' exm.txt
Yllä oleva komento päivittää rivin kolme. Harkitse alla olevaa tulosta:
löydä iPhoneni Androidista
Voimme myös käyttää säännöllistä lauseketta päivittääksesi useamman kuin yhden rivin, joilla on sama kuvio. Harkitse alla olevaa komentoa:
sed '/Apple is /c Line updated.' exm.txt
Yllä oleva komento päivittää kaikki rivit, joissa on merkkijono 'Apple on'. Harkitse alla olevaa tulosta:
Hahmojen muuntaminen
Y-lippua käytetään merkkien muuntamiseen. Merkkien muuntamista ei voida rajoittaa tiettyihin tapahtumiin. Jos haluat muuttaa merkkejä, suorita komento seuraavasti:
sed 'y/abc/def/' exm.txt
Yllä oleva komento muuttaa merkit 'a', 'b', 'c' merkit 'd', 'e', 'f'. harkitse alla olevaa tulosta:
Rivinumeroiden tulostaminen
'='-merkkiä käytetään rivinumeron tulostamiseen. Tulosta rivinumero suorittamalla komento seuraavasti:
sed '=' exm.txt
Yllä oleva komento näyttää tiedoston sisällön rivinumeron. Harkitse alla olevaa tulosta:
Yhtävyysmerkki '-n'-vaihtoehdon kanssa määrittää rivinumeron, joka sisältää vastaavan skriptin. Harkitse alla olevaa tulosta:
sed -n '/mango/=' exm.txt
Yllä oleva komento näyttää rivinumeron, joka sisältää sanan 'mango'. Harkitse alla olevaa tulosta:
Yllä olevasta tuloksesta voimme nähdä, että rivillä numero 2 on sana 'mango'.