Ero sivun ”Ed” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
p (johdanto)
 
(9 välissä olevaa versiota 5 käyttäjän tekeminä ei näytetä)
Rivi 1: Rivi 1:
Ed on [[tekstitila]]ssa toimiva [[rivieditori]] jolla tiedostoa käsitellään rivi kerrallaan. Siitä on nykyään hyötyä lähinnä [[Bash-skriptaus|skripteissä]] ja tilanteessa, jossa [[pääte|päätteen]] asetukset ovat niin sekaisin etteivät kehittyneemmät esim. [[ncurses]]ia käyttävät kokoruudun tekstieditorit toimi. Ed löytyy käytännössä jokaisesta [[Unix]]-järjestelmästä.  
{{DISPLAYTITLE:{{lcfirst:{{PAGENAME}}}}}}
'''ed''' on [[tekstitila]]ssa toimiva [[rivieditori]], jolla tiedostoa käsitellään rivi kerrallaan. Siitä on nykyään hyötyä lähinnä [[Bash-skriptaus|skripteissä]] ja tilanteessa, jossa [[pääte|päätteen]] asetukset ovat niin sekaisin etteivät kehittyneemmät esim. [[ncurses]]ia käyttävät kokoruudun tekstieditorit toimi. <tt>ed</tt> löytyy käytännössä jokaisesta [[Unix]]-järjestelmästä.  


[[Vi]]-editorin taustalla oleva [[Ex]]-rivieditori pohjautuu Ediin. Ed on lisäksi vaikuttanut esimerkiksi [[grep]]in ja [[awk]]:n kehitykseen.
[[vi]]-editorin taustalla oleva [[ex]]-rivieditori pohjautuu <tt>ed</tt>iin. <tt>ed</tt> on lisäksi vaikuttanut esimerkiksi [[grep]]in ja [[awk]]:n kehitykseen.


== Perustietoa ==
== Perustietoa ==
Ed oli Unix-järjestelmän perustekstieditori. Sen alkuperäisellä [[man]]-sivulla lukikin ''"Ed is the standard text editor"'', "''Ed on oletustekstieditori''". Ken Thompson kirjoitti ensimmäisen version siitä assembly-kielellä vuonna 1969. Jo tällöin mukana oli yksi Edin tärkeimmistä ominaisuuksista: tuki [[säännöllinen lauseke|säännöllisille lausekkeille]].
<tt>ed</tt> oli Unix-järjestelmän perustekstieditori. Sen alkuperäisellä [[man]]-sivulla lukikin ''"Ed is the standard text editor"'', "''Ed on oletustekstieditori''". [[wikipedia:fi:Ken Thompson|Ken Thompson]] kirjoitti ensimmäisen version siitä [[wikipedia:fi:Assembly_(ohjelmointikieli)|assembly]]-kielellä vuonna 1969. Jo tällöin mukana oli yksi <tt>ed</tt>in tärkeimmistä ominaisuuksista: tuki [[säännöllinen lauseke|säännöllisille lausekkeille]].


Ed on kuuluisa taloudellisuudestaan: se ei näytä mitään ellei sitä käsketä tekemään jotain. Virheilmoituksetkin ovat vain kysymysmerkkejä (tosin ihan niin huono Ed ei kuitenkaan ole, virheilmoitukset saa päälle komennolla H). Tämä oli hyvä ominaisuus Edin ensimmäisten versioiden aikoihin jolloin ohjelman tuloste tuli kirjoittimelle ja levytila ja muistin määrä olivat rajalliset. Tänä päivänä tämä ominaisuus ei enää ole tärkeä.
<tt>ed</tt> on kuuluisa taloudellisuudestaan: se ei näytä mitään ellei sitä käsketä tekemään jotain. Virheilmoituksetkin ovat vain kysymysmerkkejä (tosin ihan niin huono <tt>ed</tt> ei kuitenkaan ole, virheilmoitukset saa päälle komennolla H). Tämä oli hyvä ominaisuus <tt>ed</tt>in ensimmäisten versioiden aikoihin jolloin ohjelman tuloste tuli kirjoittimelle ja levytila ja muistin määrä olivat rajalliset. Tänä päivänä tämä ominaisuus ei enää ole tärkeä.


== Yksinkertainen muokkaus ==
== Yksinkertainen muokkaus ==
Ed on rivieditori, mikä tarkoittaa sitä, että kaikki työskentely kohdistuu aina yhteen tai useampaan riviin tai rivin osaan. Sillä, mitä ruudulla näkyy, ei ole väliä.
<tt>ed</tt> on rivieditori, mikä tarkoittaa sitä, että kaikki työskentely kohdistuu aina yhteen tai useampaan riviin tai rivin osaan. Sillä, mitä ruudulla näkyy, ei ole väliä.


Ediä käytetään kahdessa eri tilassa, on ''komentotila'' ja ''kirjoitustila''. Käynnistyksen jälkeen Ed on komentotilassa jolloin se lukee käyttäjän kirjoittamia komentoja ja suorittaa niitä. Kaikki komennot ovat yhden merkin mittaisia mutta jotkut vaativat myös erillisiä parametrejä. Komento voi esimerkiksi tarkoittaa "''tallenna ja lopeta''".
<tt>ed</tt>iä käytetään kahdessa eri tilassa, on ''komentotila'' ja ''kirjoitustila''. Käynnistyksen jälkeen <tt>ed</tt> on komentotilassa jolloin se lukee käyttäjän kirjoittamia komentoja ja suorittaa niitä. Kaikki komennot ovat yhden merkin mittaisia, mutta jotkut vaativat myös erillisiä parametrejä. Komento voi esimerkiksi tarkoittaa "''tallenna ja lopeta''".


Tietyllä komennolla Ed siirtyy kirjoitustilaan. Näitä ovat a (lisää tekstiä valitun kohdan perään), i (lisää tekstiä ennen valittua kohtaa) ja c (muuta valittuja rivejä).
Tietyillä komennoilla <tt>ed</tt> siirtyy kirjoitustilaan. Näitä ovat a (lisää tekstiä valitun kohdan perään), i (lisää tekstiä ennen valittua kohtaa) ja c (muuta valittuja rivejä).


=== Tiedostoon kirjoittaminen ja tiedoston tallentaminen ja avaaminen ===
=== Tiedostoon kirjoittaminen ja tiedoston tallentaminen ja avaaminen ===
Luodaan aluksi yksinkertainen tiedostoa Ediä käyttäen. Käynnistetään Ed ensin komennolla  
Luodaan aluksi yksinkertainen tiedostoa <tt>ed</tt>iä käyttäen. Käynnistetään <tt>ed</tt> ensin komennolla  
  $ ed
  $ ed
Tämän jälkeen kirjoitetaan tiedostoon tekstiä. Aluksi siirrytään kirjoitustilaan ja kirjoitetaan nykyisen kohdan (tiedoston alun) perään antamalla komento a ja painamalla tämän jälkeen enteriä. Tämän jälkeen voidaan kirjoittaa haluttua sisältöä tiedostoon. Rivinvaihto tapahtuu enterillä. Kirjoittaminen lopetetaan kirjoittamalla enterin painamisen jälkeen aukeavalle riville vain piste ja painamalla enteriä:
Tämän jälkeen kirjoitetaan tiedostoon tekstiä. Aluksi siirrytään kirjoitustilaan ja kirjoitetaan nykyisen kohdan (tiedoston alun) perään antamalla komento a ja painamalla tämän jälkeen {{Näppäin|enter}}. Tämän jälkeen voidaan kirjoittaa haluttua sisältöä tiedostoon. Rivinvaihto tapahtuu {{Näppäin|enter}}. Kirjoittaminen lopetetaan kirjoittamalla {{Näppäin|enter}} painamisen jälkeen aukeavalle riville vain piste ja painamalla {{Näppäin|enter}}:
  a
  a
  Ed on monipuolinen tekstieditori.
  <tt>ed</tt> on monipuolinen tekstieditori.
  Ehkä tätä ei kuitenkaan kannata käyttää wikin muokkaamiseen?
  Ehkä tätä ei kuitenkaan kannata käyttää wikin muokkaamiseen?
  .
  .
Pisteen antamisen jälkeen Ed siirtyy takaisin komentotilaan mutta ei ilmoita siitä mitenkään. Seuraavaksi tallennetaan luotu tiedosto komennolla w. Komennolle annetaan parametrina tallennettavan tiedoston nimi:
Pisteen antamisen jälkeen <tt>ed</tt> siirtyy takaisin komentotilaan mutta ei ilmoita siitä mitenkään. Seuraavaksi tallennetaan luotu tiedosto komennolla w. Komennolle annetaan parametrina tallennettavan tiedoston nimi:
  w tiedosto
  w tiedosto
Komennon perään Ed tulostaa tiedostoon kirjoitettujen merkkien lukumäärän:
Komennon perään <tt>ed</tt> tulostaa tiedostoon kirjoitettujen merkkien lukumäärän:
  w tiedosto 101
  w tiedosto 101
Lopuksi Ed voidaan lopettaa komennolla q. Jos tiedostoa ei oltaisi tallennettu, Ed antaisi tässä tapauksessa virheilmoituksen (eli tulostaisi kysymysmerkin). Virheilmoituksen syyn näkee komennolla h. Tässä tapauksessa se olisi ''Warning: file modified''. Jos tämän jälkeen annetaan uudelleen komento q, Ed sulkeutuu eikä muutoksia tallenneta. Komennolla Q Ed sulkeutuu joka tapauksessa riippumatta siitä, onko muutoksia tallentamatta.
Lopuksi <tt>ed</tt> voidaan lopettaa komennolla q. Jos tiedostoa ei oltaisi tallennettu, <tt>ed</tt> antaisi tässä tapauksessa virheilmoituksen (eli tulostaisi kysymysmerkin). Virheilmoituksen syyn näkee komennolla h. Tässä tapauksessa se olisi ''Warning: file modified''. Jos tämän jälkeen annetaan uudelleen komento q, <tt>ed</tt> sulkeutuu eikä muutoksia tallenneta. Komennolla Q <tt>ed</tt> sulkeutuu joka tapauksessa riippumatta siitä, onko muutoksia tallentamatta.


Avataan seuraavaksi äsken luotu tiedosto komennolla
Avataan seuraavaksi äsken luotu tiedosto komennolla
Rivi 36: Rivi 37:
  e tiedosto
  e tiedosto
  101
  101
Komennon jälkeen Ed käynnistyy ja tulostaa tiedostossa olevien merkkien määrän. Nyt tiedoston perään voitaisiin lisätä tekstiä komennolla a tai i (tiedoston lataamisen jälkeen "kursori" on tiedoston lopussa, joten on ihan sama, lisätäänkö teksti ennen tiedoston loppua vai sen jälkeen).
Komennon jälkeen <tt>ed</tt> käynnistyy ja tulostaa tiedostossa olevien merkkien määrän. Nyt tiedoston perään voitaisiin lisätä tekstiä komennolla a tai i (tiedoston lataamisen jälkeen "kursori" on tiedoston lopussa, joten on ihan sama, lisätäänkö teksti ennen tiedoston loppua vai sen jälkeen).


Tässä tapauksessa kun tiedosto on avattu, se voidaan tallentaa normaalisti komennolla w. Ed tulostaa taas tallennettujen merkkien määrän.
Tässä tapauksessa kun tiedosto on avattu, se voidaan tallentaa normaalisti komennolla w. <tt>ed</tt> tulostaa taas tallennettujen merkkien määrän.


Kun Ed on käynnissä, komennolla f nähdään tiedoston oletusnimi (jolle tiedosto tallennetaan komennolla w, aluksi avatun tiedoston nimi):
Kun <tt>ed</tt> on käynnissä, komennolla f nähdään tiedoston oletusnimi (jolle tiedosto tallennetaan komennolla w, aluksi avatun tiedoston nimi):
  f
  f
  tiedosto
  tiedosto
Rivi 74: Rivi 75:
Tiedoston viimeiseen riviin viitataan dollarimerkillä $. Siispä koko tiedoston sisältö tulostettaisiin komennolla
Tiedoston viimeiseen riviin viitataan dollarimerkillä $. Siispä koko tiedoston sisältö tulostettaisiin komennolla
  1,$p
  1,$p
Myös negatiivisa rivinumeroita voidaan käyttää. Tällöin esimerkiksi -1 viittaa toiseksiviimeiseen riviin, -2 kolmanneksiviimeiseen jne. Esimerkiksi kaksi viimeistä riviä tulostetaan komennolla  
Myös negatiivisa rivinumeroita voidaan käyttää. Tällöin esimerkiksi -1 viittaa toiseksi viimeiseen riviin, -2 kolmanneksi viimeiseen jne. Esimerkiksi kaksi viimeistä riviä tulostetaan komennolla  
  -1,$p
  -1,$p


Ed pitää muistissa, mitä riviä on viimeksi käsitelty (esimerkiksi kirjoitettu tai tulostettu). Esimerkiksi rivi 2 valittaisiin vaikkapa tulostamalla se:
<tt>ed</tt> pitää muistissa, mitä riviä on viimeksi käsitelty (esimerkiksi kirjoitettu tai tulostettu). Esimerkiksi rivi 2 valittaisiin vaikkapa tulostamalla se:
  2p
  2p
Tällä hetkellä valittuna oleva rivi näkyy komennolla  
Tällä hetkellä valittuna oleva rivi näkyy komennolla  
Rivi 84: Rivi 85:
  $=
  $=


Tiedostossa voidaan liikkua eteen ja taaksepäin enterillä ja + ja - -merkeillä. Esimerkiksi jos meillä on 4-rivinen tiedosto jonka sisältö on:
Tiedostossa voidaan liikkua eteen ja taaksepäin {{Näppäin|enter}} ja {{Näppäin|+}} ja {{Näppäin|-}} -merkeillä. Esimerkiksi jos meillä on 4-rivinen tiedosto jonka sisältö on:
  rivi 1
  rivi 1
  rivi 2
  rivi 2
Rivi 92: Rivi 93:
  1
  1
  rivi 1
  rivi 1
  [ENTER]
  {{Näppäin|enter}}
  rivi 2
  rivi 2
  [ENTER]
  {{Näppäin|enter}}
  rivi 3
  rivi 3
  -
  -
Rivi 148: Rivi 149:
  Rivi 2
  Rivi 2


=== Alueen korvata ===
=== Alueen korvaaminen ===
Komennolla c (''change'') voidaan korvata tiettyjen rivien tekstit toisella tekstillä. Esimerkiksi rivien 2-3 paikalle lisätään käyttäjän kirjoittama teksti (jossa voi olla haluttu määrä rivejä) komennolla
Komennolla c (''change'') voidaan korvata tiettyjen rivien tekstit toisella tekstillä. Esimerkiksi rivien 2-3 paikalle lisätään käyttäjän kirjoittama teksti (jossa voi olla haluttu määrä rivejä) komennolla
  2,3c
  2,3c
Tämän jälkeen tekstiä kirjoitetaan kuten komennon a jälkeen ja kirjoittaminen lopetetaan kirjoittamalla tyhjälle riville piste ja painamalla enteriä. Esimerkiksi muokkaamme taas samaa tiedostoa:
Tämän jälkeen tekstiä kirjoitetaan kuten komennon a jälkeen ja kirjoittaminen lopetetaan kirjoittamalla tyhjälle riville piste ja painamalla {{Näppäin|enter}}. Esimerkiksi muokkaamme taas samaa tiedostoa:
  1c
  1c
  1.1
  1.1
Rivi 181: Rivi 182:
Jos rivejä ei aseteta, komento kohdistuu tällä hetkellä valitulle riville.
Jos rivejä ei aseteta, komento kohdistuu tällä hetkellä valitulle riville.


Viimeisen kauttaviivan jälkeen voidaan lisätä kirjain p, jolloin Ed tulostaa komennon vaikutuksen. Esimerkiksi:
Viimeisen kauttaviivan jälkeen voidaan lisätä kirjain p, jolloin <tt>ed</tt> tulostaa komennon vaikutuksen. Esimerkiksi:
  1,2p
  1,2p
  Rivi 1
  Rivi 1
Rivi 190: Rivi 191:
  RIvi 1
  RIvi 1
  TekstI 2
  TekstI 2
Huomataan, että korvaamisen jälkeen Ed tulosti vain viimeisimmän muokkauksen tuloksen ja että muokkaus kohdistui vain jokaisen rivin ensimmäiseen osumaan. Jotta kaikki osumat korvattaisiin, on viimeisen kauttaviivan jälkeen lisättävä komento g (''global''):
Huomataan, että korvaamisen jälkeen <tt>ed</tt> tulosti vain viimeisimmän muokkauksen tuloksen ja että muokkaus kohdistui vain jokaisen rivin ensimmäiseen osumaan. Jotta kaikki osumat korvattaisiin, on viimeisen kauttaviivan jälkeen lisättävä komento g (''global''):
1,2s/i/I/gp
1,2s/i/I/gp


Rivi 196: Rivi 197:
Halutun rivin etsiminen on tärkeä ominaisuus. Haku onnistuu komennolla <tt>/hakusana/</tt>. Komento etsii ensimmäisen rivin jolta haettava sana löytyy, asettaa sen nykyiseksi riviksi (kts. .=) ja tulostaa kyseisen rivin sisällön.
Halutun rivin etsiminen on tärkeä ominaisuus. Haku onnistuu komennolla <tt>/hakusana/</tt>. Komento etsii ensimmäisen rivin jolta haettava sana löytyy, asettaa sen nykyiseksi riviksi (kts. .=) ja tulostaa kyseisen rivin sisällön.


Tekstin etsiminen voidaan yhdistää tekstin korvaamiseen: seuraavassa haetaan seuraava rivi, jolta löytyy sana "Vim", asetetaan se (automaattisest) nykyiseksi riviksi ja korvaltaan kyseiseltä riviltä sana "Vim" sanalla "Ed":
Tekstin etsiminen voidaan yhdistää tekstin korvaamiseen: seuraavassa haetaan seuraava rivi, jolta löytyy sana "Vim", asetetaan se (automaattisest) nykyiseksi riviksi ja korvaltaan kyseiseltä riviltä sana "Vim" sanalla "ed":
  /Vim/s/Vim/Ed/gp
  /Vim/s/Vim/ed/gp
Yhdistäminen toimii myös muiden komentojen kanssa, esimerkiksi löydettyä riviä seuraava rivi tulostetaan komennolla
Yhdistäminen toimii myös muiden komentojen kanssa, esimerkiksi löydettyä riviä seuraava rivi tulostetaan komennolla
  /Hakusana/+1 p
  /Hakusana/+1 p
Rivi 215: Rivi 216:


== Säännölliset lausekkeet ==
== Säännölliset lausekkeet ==
Haettaessa tiedostosta tiettyjä rivejä ei tarvitse tyytyä pelkkään hakuun hakusanoilla, vaan voidaan myös käyttää säännöllisiä lausekkeita. Tämä tarkoittaa sitä, että hakusanaksi voidaan laittaa lauseke, josta löytyy seuraavia erikoismerkkejä:
Haussa voi käyttää [[Säännöllinen lauseke|säännöllisiä lausekkeita]].
. ^ $ [ * \
Piste tarkoittaa, että sen paikalle käy mikä tahansa merkki. Esimerkiksi kaikki merkkijonot, joissa on merkkijonojen "10" ja "11" välissä yksi merkki (esim. "10+11" ja "10Ö11", mutta ei "10++11"), toteuttavat haun
/10.11/
Pisteitä voi olla myös peräkkäin useita, esim. "l...x"-ehtoon täsmäisi merkkijono "linux" tai myös "www.linux.fi" (merkkijonon jälkeen tai ennen sitä voi olla mitä vaan).
 
^ tarkoittaa rivin alkua ja $ rivin loppua. Esimerkiksi ehtoon
/^linux
täsmäisivät rivit "linux.fi" ja "linux on käyttöjärjestelmä", mutta ei esimerkiksi "debian gnu/linux". Esimerkiksi jokaisen rivin alkuun voitaisiin lisätä sana "linux" komennolla
1,$ s/^/linux/
 
Samassa lausekkeessa voidaan käyttää sekä ^ että $ -merkkejä, esimerkiksi seuraavaan ehtoon täsmäisivät vain sellaiset rivit, joilla on 4 merkkiä:
/^....$/
 
Hakasulkujen sisällä voidaan luetella tähän kohtaan sopivat merkit, esimerkiksi ehtoon
/[23] autoa/
täsmäisivät merkkjonot "2 autoa" ja "3 autoa". Lisäksi voidaan käyttää viivaa merkkaamaan suurempaa aluetta, esimerkiksi kaikki numerot voidaan merkitä joko luettelemalla ne ([0123456789]) tai lyhyemmin [0-9].
 
Tähti tarkoittaa, että sitä edeltävä merkki (tai joku merkeistä jos käytetään hakasulkeita) voi esiintyä ennalta tuntemattoman määrän peräkkäin.
 
Jos halutaan etsiä merkkijonoa, johon kuuluu jokin säännöllisissä lausekkeissa käytettävä erikoismerkki, on tämä merkki kirjoitettava eri tavalla hakuehtoon: sen eteen lisätään \-merkki. Esimerkiksi pistettä voidaan hakea komennolla
/\./
tai kauttaviivaa komennolla
/\//


== Ulkoiset komennot ==
== Ulkoiset komennot ==
Ed mahdollistaa ulkoisten komentojen suorittamisen järjestelmän komentotulkilla ([[sh]]) ilman, että Ed täytyy välillä sulkea. Komennot suoritetaan laittamalla niiden eteen huutomerkki. Esimerkiksi nykyisen hakemiston tiedostot listataan komennolla
<tt>ed</tt> mahdollistaa ulkoisten komentojen suorittamisen järjestelmän komentotulkilla ([[sh]]) ilman, että <tt>ed</tt> täytyy välillä sulkea. Komennot suoritetaan laittamalla niiden eteen huutomerkki. Esimerkiksi nykyisen hakemiston tiedostot listataan komennolla
  !ls
  !ls
Ulkoisten komentojen tuloste voidaan liittää muokattavaan tiedostoon komennolla
Ulkoisten komentojen tuloste voidaan liittää muokattavaan tiedostoon komennolla
Rivi 249: Rivi 227:


== Lista komennoista ==
== Lista komennoista ==
Seuraavassa listassa on listattu Edin komentoja ja selitetty mitä ne tekevät. Jos komennolle on mahdollista antaa rivi, josta käsittely alkaa, on komennon eteen merkitty (.). Jos komennolle voidaan antaa useammasta rivistä koostuva alue, on komennon eteen merkitty (.,.). Suluilla voidaan viitata myös muihin parametreihin. Suluissa olevat kohdat ovat vapaaehtoisia, jos niitä ei aseteta, komento vaikuttaa kyseisellä hetkellä valitulle riville.
Seuraavassa listassa on listattu <tt>ed</tt>in komentoja ja selitetty mitä ne tekevät. Jos komennolle on mahdollista antaa rivi, josta käsittely alkaa, on komennon eteen merkitty (.). Jos komennolle voidaan antaa useammasta rivistä koostuva alue, on komennon eteen merkitty (.,.). Suluilla voidaan viitata myös muihin parametreihin. Suluissa olevat kohdat ovat vapaaehtoisia, jos niitä ei aseteta, komento vaikuttaa kyseisellä hetkellä valitulle riville.


{| border="1"
{| border="1"
Rivi 304: Rivi 282:
| u || Kumoa. Toimii seuraavien komentojen kanssa: a, c, d, g, G, i, j, m, r, s, t, v ja V.
| u || Kumoa. Toimii seuraavien komentojen kanssa: a, c, d, g, G, i, j, m, r, s, t, v ja V.
|-
|-
| (1,$)v/lauseke/komento || Aja Edin komento kaikille hakulausekkeeseen täsmääville riveille
| (1,$)v/lauseke/komento || Aja <tt>ed</tt>in komento kaikille hakulausekkeeseen täsmääville riveille
|-
|-
| (1,$)V/lauseke/ || Sama kuin edellä mutta käyttäjältä kysytään joka rivillä suoritettava komento
| (1,$)V/lauseke/ || Sama kuin edellä mutta käyttäjältä kysytään joka rivillä suoritettava komento
Rivi 326: Rivi 304:
*[[Vim]]
*[[Vim]]
*[[Awk]]
*[[Awk]]
*[[Grep]]
*[[grep]]


== Aiheesta muualla ==
== Aiheesta muualla ==
*[http://www.unix.se/Ed Ed-artikkeli] unix.se-wikissä (ruotsiksi). Tämä artikkeli on osittain käännetty kyseisestä unix.se-wikin [http://creativecommons.org/licenses/by/2.0/ CC-BY]-lisensoidusta artikkelista.
*[http://www.unix.se/Ed <tt>ed</tt>-artikkeli] unix.se-wikissä (ruotsiksi), josta tämä artikkeli on osittain käännetty. [[Keskustelu:Ed|Lisätietoja]].




[[Luokka: Tekstieditorit]]
[[Luokka: Tekstieditorit]]
[[Luokka:Komentorivin perustyökalut]]
[[Luokka:Komentorivin perustyökalut]]

Nykyinen versio 5. maaliskuuta 2021 kello 16.39

ed on tekstitilassa toimiva rivieditori, jolla tiedostoa käsitellään rivi kerrallaan. Siitä on nykyään hyötyä lähinnä skripteissä ja tilanteessa, jossa päätteen asetukset ovat niin sekaisin etteivät kehittyneemmät esim. ncursesia käyttävät kokoruudun tekstieditorit toimi. ed löytyy käytännössä jokaisesta Unix-järjestelmästä.

vi-editorin taustalla oleva ex-rivieditori pohjautuu ediin. ed on lisäksi vaikuttanut esimerkiksi grepin ja awk:n kehitykseen.

Perustietoa[muokkaa]

ed oli Unix-järjestelmän perustekstieditori. Sen alkuperäisellä man-sivulla lukikin "Ed is the standard text editor", "Ed on oletustekstieditori". Ken Thompson kirjoitti ensimmäisen version siitä assembly-kielellä vuonna 1969. Jo tällöin mukana oli yksi edin tärkeimmistä ominaisuuksista: tuki säännöllisille lausekkeille.

ed on kuuluisa taloudellisuudestaan: se ei näytä mitään ellei sitä käsketä tekemään jotain. Virheilmoituksetkin ovat vain kysymysmerkkejä (tosin ihan niin huono ed ei kuitenkaan ole, virheilmoitukset saa päälle komennolla H). Tämä oli hyvä ominaisuus edin ensimmäisten versioiden aikoihin jolloin ohjelman tuloste tuli kirjoittimelle ja levytila ja muistin määrä olivat rajalliset. Tänä päivänä tämä ominaisuus ei enää ole tärkeä.

Yksinkertainen muokkaus[muokkaa]

ed on rivieditori, mikä tarkoittaa sitä, että kaikki työskentely kohdistuu aina yhteen tai useampaan riviin tai rivin osaan. Sillä, mitä ruudulla näkyy, ei ole väliä.

ediä käytetään kahdessa eri tilassa, on komentotila ja kirjoitustila. Käynnistyksen jälkeen ed on komentotilassa jolloin se lukee käyttäjän kirjoittamia komentoja ja suorittaa niitä. Kaikki komennot ovat yhden merkin mittaisia, mutta jotkut vaativat myös erillisiä parametrejä. Komento voi esimerkiksi tarkoittaa "tallenna ja lopeta".

Tietyillä komennoilla ed siirtyy kirjoitustilaan. Näitä ovat a (lisää tekstiä valitun kohdan perään), i (lisää tekstiä ennen valittua kohtaa) ja c (muuta valittuja rivejä).

Tiedostoon kirjoittaminen ja tiedoston tallentaminen ja avaaminen[muokkaa]

Luodaan aluksi yksinkertainen tiedostoa ediä käyttäen. Käynnistetään ed ensin komennolla

$ ed

Tämän jälkeen kirjoitetaan tiedostoon tekstiä. Aluksi siirrytään kirjoitustilaan ja kirjoitetaan nykyisen kohdan (tiedoston alun) perään antamalla komento a ja painamalla tämän jälkeen ↵ Enter. Tämän jälkeen voidaan kirjoittaa haluttua sisältöä tiedostoon. Rivinvaihto tapahtuu ↵ Enter. Kirjoittaminen lopetetaan kirjoittamalla ↵ Enter painamisen jälkeen aukeavalle riville vain piste ja painamalla ↵ Enter:

a
ed on monipuolinen tekstieditori.
Ehkä tätä ei kuitenkaan kannata käyttää wikin muokkaamiseen?
.

Pisteen antamisen jälkeen ed siirtyy takaisin komentotilaan mutta ei ilmoita siitä mitenkään. Seuraavaksi tallennetaan luotu tiedosto komennolla w. Komennolle annetaan parametrina tallennettavan tiedoston nimi:

w tiedosto

Komennon perään ed tulostaa tiedostoon kirjoitettujen merkkien lukumäärän:

w tiedosto 101

Lopuksi ed voidaan lopettaa komennolla q. Jos tiedostoa ei oltaisi tallennettu, ed antaisi tässä tapauksessa virheilmoituksen (eli tulostaisi kysymysmerkin). Virheilmoituksen syyn näkee komennolla h. Tässä tapauksessa se olisi Warning: file modified. Jos tämän jälkeen annetaan uudelleen komento q, ed sulkeutuu eikä muutoksia tallenneta. Komennolla Q ed sulkeutuu joka tapauksessa riippumatta siitä, onko muutoksia tallentamatta.

Avataan seuraavaksi äsken luotu tiedosto komennolla

$ ed tiedosto
101

Toinen vaihtoehto olisi

$ ed
e tiedosto
101

Komennon jälkeen ed käynnistyy ja tulostaa tiedostossa olevien merkkien määrän. Nyt tiedoston perään voitaisiin lisätä tekstiä komennolla a tai i (tiedoston lataamisen jälkeen "kursori" on tiedoston lopussa, joten on ihan sama, lisätäänkö teksti ennen tiedoston loppua vai sen jälkeen).

Tässä tapauksessa kun tiedosto on avattu, se voidaan tallentaa normaalisti komennolla w. ed tulostaa taas tallennettujen merkkien määrän.

Kun ed on käynnissä, komennolla f nähdään tiedoston oletusnimi (jolle tiedosto tallennetaan komennolla w, aluksi avatun tiedoston nimi):

f
tiedosto

On syytä huomata, että tämä tiedosto ei muutu kun tiedosto tallennetaan eri nimellä. Esimerkiksi jos tiedostosta tallennetaan varmuuskopio:

w varmuuskopio
f
tiedosto

Komennolle f voidaan myös antaa parametri, joka asettaa oletuksena käytettävän tiedoston nimen:

f uusi
uusi

Käydään vielä läpi yksi tiedostojen lukemiseen käytettävä komento: r (read). Komento lukee sille parametrina annetun tiedoston sisällön ja lisää sen muokattavana olevaan tiedostoon valitun kohdan perään:

$ ed tiedosto
101
r tiedosto 
101 
w
202
q

Nyt kun katsotaan tiedoston sisältöä huomataan, että siellä on sama sisältö kahteen kertaan peräkkäin.

Tulostus ja liikkuminen[muokkaa]

Tekstieditorin käyttäminen on aika hankalaa jos sillä ei näe tiedoston sisältöä. Lisäksi tässä artikkelissa on jo usempaan kertaan puhuttu "valitusta kohdasta" tai "kursorin sijainnista". Seuraavaksi käydään läpi nämä asiat.

Tiedoston sisällön tulostaminen tapahtuu komennolla p (print). Sitä ennen annetaan se alue tiedostosta, jota komento koskee muodossa [aloitusrivi],[lopetusrivi]. Esimerkiksi tiedoston kaksi ensimmäistä riviä tulostetaan komennolla

1,2p

ja kolmas rivi komennolla

3p

Kun tulostetaan vain yksi rivi, voidaan p jättää myös pois. Seuraavat komennot ovat identtiset:

2p
2

Tiedoston viimeiseen riviin viitataan dollarimerkillä $. Siispä koko tiedoston sisältö tulostettaisiin komennolla

1,$p

Myös negatiivisa rivinumeroita voidaan käyttää. Tällöin esimerkiksi -1 viittaa toiseksi viimeiseen riviin, -2 kolmanneksi viimeiseen jne. Esimerkiksi kaksi viimeistä riviä tulostetaan komennolla

-1,$p

ed pitää muistissa, mitä riviä on viimeksi käsitelty (esimerkiksi kirjoitettu tai tulostettu). Esimerkiksi rivi 2 valittaisiin vaikkapa tulostamalla se:

2p

Tällä hetkellä valittuna oleva rivi näkyy komennolla

.=

Piste on oikeastaan eräänlainen muuttuja, jonka arvo on muokattavan rivin numero. Vastaavasti esimerkiksi tiedoston rivien määrä nähdään tulostamalla $:n arvo:

$=

Tiedostossa voidaan liikkua eteen ja taaksepäin ↵ Enter ja + ja -merkeillä. Esimerkiksi jos meillä on 4-rivinen tiedosto jonka sisältö on:

rivi 1
rivi 2
rivi 3
rivi 4

Voidaan siinä liikkua seuraavasti:

1
rivi 1
↵ Enter
rivi 2
↵ Enter
rivi 3
-
rivi 2

Lisäksi voidaan liikkua useampi rivi kerrallaan muuttamalla pisteen arvoa esimerkiksi .+3 tai .-2:

1
rivi 1
.+3
rivi 4
.-2
rivi 2

Rivien poistaminen[muokkaa]

Rivien poistamiseen käytetään d (delete) -komentoa jolle annetaan poistettava alue samalla tavalla kuin tulostuskomennolle. Esimerkiksi rivit 2-3 poistettaisiin komennolla

2,3d

jolloin tulos olisi edellistä esimerkkitiedostoa muokattaessa

1,$ p
rivi 1
rivi 4

Valittuna oleva rivi (joka näkyy siis komennolla .=) poistetaan pelkästään komennolla

d

ja kaksi viimeistä riviä poistuisi komennolla

-1,$ d

Muokkausten kumoaminen[muokkaa]

Viimeisin muokkaus kumotaan komennolla

u

Tekstin siirtäminen[muokkaa]

Rivejä voidaan siirtää komennolla m (move), jonka syntaksi on

alku,loppu m kohde

Tässä kohde on se rivi, jonka perään rivit siirretään. Esimerkiksi jos muokkaamme taas edellä käytettyä nelirivistä tiedostoa siten, että kaksi ensimmäistä riviä siirretään kolmannen rivin perään:

1,2m3

ja tulos on

1,$p
Rivi 3
Rivi 1 
Rivi 2
Rivi 4

Tiedoston alkuun siirtäminen onnistuu siirtämällä rivit rivin 0 perään. Tiedoston loppuun siirrettäessä voidaan kohteena käyttää riviä $.

Tekstin kopiointi[muokkaa]

Tekstin kopiointi tapahtuu samaan tapaan kuin poistaminen, mutta nyt komento on t (transfer). Syntaksi on sama kuin edellä poistamisen yhteydessä:

alku,loppu t kohde

Esimerkki jos taas muokkaamme yksinkertaista nelirivistä tiedostoamme: kopioidaan kaksi ensimmäistä riviä tiedoston loppuun:

1,2t$
1,$p
Rivi 1
Rivi 2 
Rivi 3
Rivi 4 
Rivi 1
Rivi 2

Alueen korvaaminen[muokkaa]

Komennolla c (change) voidaan korvata tiettyjen rivien tekstit toisella tekstillä. Esimerkiksi rivien 2-3 paikalle lisätään käyttäjän kirjoittama teksti (jossa voi olla haluttu määrä rivejä) komennolla

2,3c

Tämän jälkeen tekstiä kirjoitetaan kuten komennon a jälkeen ja kirjoittaminen lopetetaan kirjoittamalla tyhjälle riville piste ja painamalla ↵ Enter. Esimerkiksi muokkaamme taas samaa tiedostoa:

1c
1.1
1.2
.
1,$p
1.1
1.2
Rivi 2
Rivi 3
Rivi 4

Rivien yhdistäminen[muokkaa]

Kaksi riviä voidaan yhdistää komennolla j (join) jonka syntaksi on

rivi,rivij

Esimerkki:

1,2p
Rivi 1
Rivi 2

1,2j 1p

Rivi 1 Rivi 2

Tekstin korvaaminen[muokkaa]

Tekstin korvaaminen hoituu komennolla s (substitute). Komento voi kohdistua yhteen tai useampaan riviin. Sitä voi käyttää esimerkiksi kirjoitusvirheiden korjaamiseen. Syntaksi on

s/korvattava/korvaava/

Komennon alkuun voidaan lisätä rivit, joille komento kohdistuu, esimerkiksi se kohdistuisi koko tiedostoon komennolla 1,$ s/vanha/uusi/ Jos rivejä ei aseteta, komento kohdistuu tällä hetkellä valitulle riville.

Viimeisen kauttaviivan jälkeen voidaan lisätä kirjain p, jolloin ed tulostaa komennon vaikutuksen. Esimerkiksi:

1,2p
Rivi 1
Teksti 2

1,2s/i/I/p

TekstI 2

1,2p

RIvi 1
TekstI 2

Huomataan, että korvaamisen jälkeen ed tulosti vain viimeisimmän muokkauksen tuloksen ja että muokkaus kohdistui vain jokaisen rivin ensimmäiseen osumaan. Jotta kaikki osumat korvattaisiin, on viimeisen kauttaviivan jälkeen lisättävä komento g (global): 1,2s/i/I/gp

Tekstin etsiminen[muokkaa]

Halutun rivin etsiminen on tärkeä ominaisuus. Haku onnistuu komennolla /hakusana/. Komento etsii ensimmäisen rivin jolta haettava sana löytyy, asettaa sen nykyiseksi riviksi (kts. .=) ja tulostaa kyseisen rivin sisällön.

Tekstin etsiminen voidaan yhdistää tekstin korvaamiseen: seuraavassa haetaan seuraava rivi, jolta löytyy sana "Vim", asetetaan se (automaattisest) nykyiseksi riviksi ja korvaltaan kyseiseltä riviltä sana "Vim" sanalla "ed":

/Vim/s/Vim/ed/gp

Yhdistäminen toimii myös muiden komentojen kanssa, esimerkiksi löydettyä riviä seuraava rivi tulostetaan komennolla

/Hakusana/+1 p

Lisäksi voidaan esimerkiksi tulostaa kahden hakusanan väliltä löytyvät rivit:

/Alku/, /Loppu/p

Jos haun halutaan tapahtuvan kohti tiedoston alkua, käytetään /:n tilalla kysymysmerkkiä ?. Edellinen haku toistetaan komennolla // tai jos haetaan taaksepäin niin komennolla ?.

Toimenpiteiden kohdistaminen kaikille riveille, jotka täsmäävät ehtoon[muokkaa]

Edellä löysimme vain seuraavan hakuehdon. Joskus kuitenkin tulee eteen tilanteita, jolloin halutaan suorittaa komento jokaiselle hakuehtoa vastaavalle riville. Tämä onnistuu käyttämällä komentoa g (global). Esimerkiksi poistetaan kaikki rivit, joilta löytyy sana "Windows":

g/Windows/d

tai korvataan jokainen tiedostossa oleva "foo" sanalla "bar":

g/foo/s/foo/bar/gp

Tässä tapauksessa toinen "foo" voitaisiin jättää pois:

g/foo/s//bar/gp

Komento v on samantapainen kuin komento g, mutta se kohdistaa operaation niille riveille, jotka eivät toteuta hakuehtoa.

Säännölliset lausekkeet[muokkaa]

Haussa voi käyttää säännöllisiä lausekkeita.

Ulkoiset komennot[muokkaa]

ed mahdollistaa ulkoisten komentojen suorittamisen järjestelmän komentotulkilla (sh) ilman, että ed täytyy välillä sulkea. Komennot suoritetaan laittamalla niiden eteen huutomerkki. Esimerkiksi nykyisen hakemiston tiedostot listataan komennolla

!ls

Ulkoisten komentojen tuloste voidaan liittää muokattavaan tiedostoon komennolla

r !komento

Komennolle voidaan tietysti myös asettaa rivi, jonka perään tuloste lisätään. Oletuksena se lisätään valitun rivin perään (kts. .=). Esimerkiksi hakemiston tiedostot listattaisiin kolmannen rivin perään komennolla

3 r !ls

Lista komennoista[muokkaa]

Seuraavassa listassa on listattu edin komentoja ja selitetty mitä ne tekevät. Jos komennolle on mahdollista antaa rivi, josta käsittely alkaa, on komennon eteen merkitty (.). Jos komennolle voidaan antaa useammasta rivistä koostuva alue, on komennon eteen merkitty (.,.). Suluilla voidaan viitata myös muihin parametreihin. Suluissa olevat kohdat ovat vapaaehtoisia, jos niitä ei aseteta, komento vaikuttaa kyseisellä hetkellä valitulle riville.

Komento Kuvaus
(.)a Lisää tekstiä valitun kohdan peerään
(.,.c)c Korvaa rivejä
(.,.)d Poistaa rivejä
e tiedosto Lataa tiedoston ja asettaa sen nimen oletustiedostonimeksi
E tiedosto Sama kuin e, mutta ei anna varoitusta jos muutoksia ei ole tallennettu
(1,$)g/lauseke/komento Ajaa komennon niille riveille, jotka täsmäävät annettuun säännölliseen lausekkeeseen
(1,$)G/lauseke/ Muokkaa jokaista lausekkeen toteuttavaa riviä interaktiivisesti (käyttäjä antaa riville ajettavan komennon)
H Virheilmoitukset päälle/pois
h Viimeisin virheilmoitus
(.)i Lisää tekstiä ennen valittua kohtaa
(.,.+1)j Yhdistää rivit
(.,.)m(.) Siirtää rivejä
(.,.)n Tulostaa rivit ja niiden rivinumerot
(.,.)p Tulostaa rivejä
P Komentokehote päälle/pois
q Lopetta ohjelman
Q Lopettaa ohjelman välittämättä tallentamattomista muutoksista
($)r tiedosto Lisää tiedoston sisällön nykyiseen tiedostoon, oletuksena loppuun
($)r !komento Ajaa järjestelmän komentotulkissa komennon ja lisää sen tulosteen tiedostoon, oletuksena loppuun
(.,.)s/lauseke/korvaava/ Korvaa rivin ensimmäisen hakulauseketta vastaavan kohdan annetulla sanalla
(.,.)s/lauseke/korvaava/g Korvaa rivin kaikki lauseketta vastaavat merkkijonot annetulla sanalla
(.,.)s/sök efter/ersätt med/n Sama kuin edellä, mutta korvaa enintään n kohtaa
(.,.)s Tekee uudelleen edellinen korvaus
(.,.)t(.) Kopioi tekstiä
u Kumoa. Toimii seuraavien komentojen kanssa: a, c, d, g, G, i, j, m, r, s, t, v ja V.
(1,$)v/lauseke/komento Aja edin komento kaikille hakulausekkeeseen täsmääville riveille
(1,$)V/lauseke/ Sama kuin edellä mutta käyttäjältä kysytään joka rivillä suoritettava komento
(1,$)w tiedosto Tallentaa sisällön tiedostoon
(1,$)wq tiedosto Tallentaa ja lopettaa
(1,$)w !komento Välittää tiedoston sisällön (tai osan siitä) ulkoisen komennon STDIN-virtaan
(1,$)W tiedosto Kirjoittaa rivit toisen tiedoston loppuun
(.+1)zn Siirry n riviä kerrallaan
!komento Aja komento sh-komentotulkilla
(.)= Tulosta nykyisen rivin numero

Katso myös[muokkaa]

Aiheesta muualla[muokkaa]