logo

Sed-komento Linuxissa/Unixissa esimerkein

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ö

    Korvauskäsky
    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 > outputTiedostonimiMuut komennot sed
    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ä:
    • 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.
    suodattimena
    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.Tiedostopohjaiset sed-skriptit
    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

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:

Linux Sed -suodatin

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:

Linux Sed -suodatin

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:

Linux Sed -suodatin

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:

Linux Sed -suodatin

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:

Linux Sed -suodatin

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
Linux Sed -suodatin

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:

Linux Sed -suodatin

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:

Linux Sed -suodatin

Liitä tekstiä suorittamalla komento seuraavasti:

 echo 'Another Demo' | sed 'aFirst Demo' 

Yllä oleva komento liittää tekstin. Harkitse alla olevaa tulosta:

Linux Sed -suodatin

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
Linux Sed -suodatin

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:

Linux Sed -suodatin

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:

Linux Sed -suodatin

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:

Linux Sed -suodatin

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:

Linux Sed -suodatin

Yllä olevasta tuloksesta voimme nähdä, että rivillä numero 2 on sana 'mango'.