Ed
Från Unix.se, den fria unixresursen.
Ed var den ursprungliga standardtexteditorn i UNIX. Från dess ursprungliga man-sida: "Ed is the standard text editor." Trots att ed nu har drygt 30 år på nacken och knappast längre används av vanliga dödliga är det nyttigt att veta hur den fungerar. Eds syntax har nämligen influerat många välanvända Unix-program som t.ex. grep, sed och awk. Vi:s historia kan härledas till ed.
Innehåll |
Historia
Ed var influerad av en ännu äldre editor, QED, som Ken Thompson använde på Berkeley. Bland det första han gjorde när han började på Bell Labs var att skriva en ny version i assembler för MIT CTSS-systemet. Den stora nyheten var reguljära uttryck. Ed skrevs först av Ken Thompson 1969 i assembler för PDP-7:an och skrevs senare om i C.
Varför ska man då lära sig ed? Förutom att man, som ovan nämnt, får en bättre förståelse av verktyg som grep och sed kan man vara säker på att ed nästan alltid finns på ett unix-system, oftast under /bin. En liten storleksjämförelse:
-rwxr-xr-t 2 root wheel 5767751 Nov 5 2001 /usr/local/bin/emacs -rwxr-xr-x 1 root wheel 1173716 Jun 7 15:03 /usr/local/bin/vim -r-xr-xr-x 6 root wheel 278956 Oct 11 22:32 /usr/bin/vi -r-xr-xr-x 2 root wheel 142780 Oct 11 22:29 /bin/ed
Ed är (ö)känd för sin sparsamhet. Den visar aldrig något såvida du inte ber den göra det. Felmeddelandet är ett frågetecken. (Så illa är det inte; skriv H för att slå på/av visning av felmeddelanden. Default är av. Kommandot h skriver ut förklaring av senaste felet.) Detta var bra förr i tiden då outputen skrevs av en line-printer och hårddiskutrymmet/minnet var begränsat. Nuförtiden är dessa "fördelar" förstås oftast knappast relevanta.
Sätt igång
Ed är en s.k. line-oriented, "radorienterad" editor, vilket innebär att du bara kan arbeta med innehållet en rad i taget, oavsett vad som står på skärmen. Ed har två olika lägen: kommando (command) och input. När ed startas är det i kommando-läge. I detta läge läses kommandon från stdin (standard input) och exekveras för att manipulera buffertens innehåll eller utföra något annat, som att t.ex. spara eller avsluta.
När ett input-kommando som t.ex. a (append), i (insert) eller c (change) ges går ed in i input-läge, där man kan skriva in själva texten som ska läggas till i bufferten. Input mode avslutas med en punkt på en egen rad.
Texten du arbetar med lagras alltid i en buffert, som är en temporär lagringsplats. När du är klar och sparar så kopieras buffertens innehåll till en permanent lagringsplats.
Nu ska vi börja använda ed. Text i fet stil är den vi skriver in. Starta ed:
$ ed
Använd append-kommandot, a, för att lägga till text:
a Ed is the standard text editor. Visst är det trevligt? .
I och med en ensam punkt på en egen rad är vi tillbaka i kommando-läge. För att spara bufferten till en fil använder vi kommandot w (write):
w foo 55
55 är antalet tecken som skrevs till filen foo, inklusive newlines. Om foo redan finns skrivs den över.
Skriv q (quit) för att avsluta ed:
q
Vi startar ed igen och använder kommandot e (edit) för att läsa in den sparade filen i buffern (ed foo går också bra). Finns något redan i buffern tas det först bort.
$ ed e foo 55
Och så lägger vi till lite text:
a Ed är inte alls svår att använda. Eller hur? .
Det enda felmeddelandet ed någonsin ger oss är '?'. Ett frågetecken får vi även om vi försöker avsluta innan vi sparat buffern (Q för att slippa detta):
q ?
Nu kan vi skriva q igen för att avsluta utan att spara, men det ska vi inte göra nu. När ed läst in en fil i buffern så räcker det med w för att spara:
w 100
File och read
Använd kommandot f (file) om du vill ta reda på vilket filnamn det är som ed "kommer ihåg":
f foo
Vi gör en backup av den här filen och kollar att foo fortfarande är det namn som ed kommer ihåg:
w bar 100 f foo
Kommandot f utan argument returnerar filnamnet, men vad händer om ett argument ges?
f foo f foobar foobar f foobar f foo foo
f ändrar alltså filnamnet ed har i minnet.
För att läsa in en fil till buffern, utan att ta bort det redan befintliga, kan vi använda r (read):
r foo
Ovanstående lägger till innehållet i filen foo. I det här fallet får vi alltså en kopia av texten. För att ångra kommandot använder vi u (undo).
u
Print och navigering
För att skriva ut innehållet i en buffert, eller delar av det, använder vi kommandot p (print). Syntaxet är start,slutp. För att skriva ut de två första raderna skriver vi alltså:
1,2p Ed is the standard text editor.
Vi kan skriva ut bara en rad så här:
3p Visst är det trevligt?
Eller helt enkelt:
3 Visst är det trevligt?
För att skriva ut samtliga rader i bufferten kan du ta hjälp av dollartecknet, $, som representerar den sista raden:
1,$p Ed is the standard text editor. Visst är det trevligt? Ed är inte alls svår att använda. Eller hur?
Vi kan också använda plus och minus. Följande skriver ut de två sista raderna:
$-1,$p Ed är inte alls svår att använda. Eller hur?
Ed håller reda på vilken rad du senast gjorde något med. Denna rad ("current line") representeras av en punkt. Skriver du 1,3p blir den tredje raden punkten, eftersom det var den sista du gjorde något med (skrev ut, i det här fallet). Raden du arbetar med är alltså representerad av en punkt.
2p
Sätter punkten till andra raden.
.p text editor p text editor
Gör samma sak.
.= 2
Tar reda på radnumret.
$= 5
Tar reda på antalet rader i bufferten.
Du kan gå framåt och bakåt i bufferten med Enter respektive -:
1 Ed is the standard <Enter> text editor. <Enter> Visst är det trevligt? <Enter> Ed är inte alls svår att använda. - Visst är det trevligt?
Du kan gå framåt och bakåt flera rader samtidigt på följande vis:
1 Ed is the standard .+3 Ed är inte alls svår att använda. .-3 Ed is the standard
Ta bort rader
För att ta bort rader använder vi d (delete). Radnumrena specifieras på samma sätt som med p.
Ta bort raderna två och tre:
2,3d
Verifiera:
1,$p Ed is the standard Ed är inte alls svår att använda. Eller hur?
Om det finns en rad efter den sista som togs bort sätts punkt till denna, annars blir det raden innan det som togs bort. I det här fallet blir punkt rad nummer två, "Ed är inte alls svår att använda."
Ta bort raden du är på:
d
Ta bort sista två raderna:
$-1,$d
Flytta text
Vi kan flytta text med kommandot m (move). Vi börjar på en ny fil och skriver in lite text:
$ ed a text editor. Ed is the standard ed är svår att använda. Det är definitivt inte så att .
Här måste vi onekligen flytta om lite. Syntaxet är start,slutmdestination. (Destination är "efter denna rad"). Vi börjar med att flytta ner den första raden ett snäpp:
1m2 1,2p Ed is the standard text editor.
Vi hade också kunnat skriva följande, vilket flyttar rad nummer två till början av bufferten (0):
2m0 1,2p Ed is the standard text editor.
Någon av de två sista raderna måste vi förstås också göra något med:
$m$-1 (eller 4m2) 1,$p Ed is the standard text editor. Det är definitivt inte så att ed är svår att använda.
Vi flyttar ner de två första raderna så att de hamnar i slutet:
1,2m$ 1,$p Det är definitivt inte så att ed är svår att använda. Ed is the standard text editor.
Kopiera rader
Vi kan kopiera textrader med t (transfer). Syntaxet är start,sluttdestination.
1,2t4 1,$p Det är definitivt inte så att ed är svår att använda. Ed is the standard text editor. Det är definitivt inte så att ed är svår att använda.
Ändra/ersätt en rad
För att ersätta en eller flera rader använder vi c (change). Detta kommando tar först bort de rader du vill ersätta och låter dig sedan skriva in så många nya du vill, som med append. Vi ändrar de två sista raderna:
3,4c Ed är kung bland texteditors. Eller kanske inte längre. Men nog är det användbart? . 1,$p Det är definitivt inte så att ed är svår att använda Ed är kung bland texteditors. Eller kanske inte längre. Men nog är det användbart?
Insert-kommandot
Kommandot a (append) har vi använt. Det sätter in text efter angiven rad. Kommandot i (insert) fungerar på samma sätt men sätter in text innan angiven rad. Exempel:
1p Det är definitivt inte så att i Den här raden hamnar ovanför. . 1,2p Den här raden hamnar ovanför. Det är definitivt inte så att
Slå ihop rader
Om vi vill slå ihop två rader till en kan vi använda kommandot j (join).
1,2p Ed is the standard text editor. 1,2j 1p Ed is the standard text editor.
Ersätt efter mönster
Nu kommer vi till något roligare, nämligen regular expressions och kommandot s (substitute). Detta kommando kan användas för att ersätta något i bufferten med något annat, på en eller flera rader. Ett av väldigt många användningsområden är att rätta stavfel och dylikt.
Syntax för att ersätta första gammal med ny på raden du är på:
s/gammal/ny/
Ersätt första gammal med ny på raden n:
ns/gammal/ny/
Ersätt första gammal med ny på raderna n till m:
n,ms/gammal/ny/
Man kan lägga till p för att skriva ut resultatet av ändringen. Om vi är på rad två och vill ändra 'definitivt' till 'verkligen' gör vi så här:
s/definitivt/verkligen/p Det är verkligen inte så att
Vi kan också ta bort delar av en rad:
$-1s/kanske //p Eller inte längre.
Tar bort 'kanske ' på näst sista raden.
1,$s/är/ÄR/p Men nog ÄR det användbart? 1,$p Den hÄR raden hamnar ovanför. Det ÄR verkligen inte så att ed ÄR svår att använda Ed ÄR kung bland texteditors. Eller inte längre. Men nog ÄR det användbart?
Ändrar alla 'är' till 'ÄR'.
Det vi just använt ändrar bara det första 'är' som hittas i på en rad; hade det funnits ett på samma rad till hade det inte ändrats. Vill vi ändra alla 'är' på en rad kan vi lägga till g (global):
s/är/ÄR/gp
För mer om regular expressions, se "Specialtecken" längre ner och denna artikel.
Sökning
En annan viktig sak i ed är hur man söker. Ha följande i bufferten:
Ed är kung bland texteditors. Eller kanske inte längre. Men nog är det användbart?
Om du vill hitta raden som innehåller ordet 'kanske' skriver du:
/kanske/ Eller kanske inte längre.
Det returnerar raden som hittades, sätter punkt till den raden, och skriver ut den.
Sökningen kan kombineras med substitution-kommandot för att göra allt på en gång:
/kanske/s/kanske/verkligen/p Eller verkligen inte längre.
Du kan använda nummer på följande vis:
/kung/+1p Eller verkligen inte längre.
För att skriva ut raden efter den som matchades.
/kung/,/användbart/p
Skriver ut raderna som matchades samt de mellan dem.
Använd ? istället för / om du vill söka bakåt. Om du vill upprepa en sökning kan du använda // (eller ?? för att upprepa sökningen men bakåt).
Globala kommandon
Kommandot g kan användas för att utföra ett eller flera kommandon på rader som matchar.
g/foo/d
Tar bort alla rader som har 'foo' i sig.
g/foo/s//bar/gp
Ersätter alla 'foo' med 'bar' på alla rader och skriver ut varje rad.
Kommandot v är som g, men kommandon körs på varje rad som inte matchar.
v/ /d
Tar bort varje rad som inte innehåller ett blanksteg.
Specialtecken
Det finns ett gäng specialtecken som du kan använda på olika sätt. Dessa kan du inte använda som vilka vanliga tecken som helst; de har olika betydelser. Vill du använda dem som vanliga tecken måste du sätta ett \ före. De är följande:
^ . $ [ * \
En punkt i en sökning betyder "vilket tecken som helst".
/a.c/
Matchar både exempelvis abc och atc.
För att matcha början eller slutet på rader kan du använda två specialtecken, ^ (cirkumflex) respektive $ (dollartecken).
/^foo/
Matchar 'foo bar' men inte 'Zzzfoo bar'.
1,$s/^/Foo/
Lägger till 'Foo' i början av varje rad.
/bar$/
Matchar rad som slutar på 'bar'.
/^bar$/
Matchar rad som bara består av 'bar'.
/^...$/
Matchar rad som består av exakt tre tecken.
- är repetitionstecknet. 4* matchar obegränsat antal fyror, .* matchar obegränsat antal tecken.
/[0-9].*/
Matchar vilken siffra som helst följd av obegränsat antal tecken.
Vill vi hitta en vanlig punkt måste vi escape:a den med backslash:
Specialtecken måste som sagt escape:as med \ om du vill använda dem som vanliga tecken.
/\./
Matchar en punkt i en rad.
/\\/
Matchar ett backslash i en rad.
Ett annat användbart tecken är &, som kan användas på högra sidan i ett substitute-kommando. Det står för det som matchades på den vänstra sidan. Har vi raden "Ed är kung bland texteditors." och vill lägga till "Ed is the standard editor." till samma rad kan vi skriva så här:
s/.*/Ed är kung bland texteditors. Ed is the standard editor./
Men för att slippa skriva den matchade raden igen kan vi helt enkelt göra så här:
s/.*/& Ed is the standard editor/
Systemkommandon i ed
Från ed kan du köra systemkommandon utan att lämna editorn - sätt bara ett utropstecken framför. T.ex.:
!ls
En del vanliga ed-kommandon användas tillsammans med systemkommandon.
r !ls
Läser in outputen av ls-kommandot till slutet av bufferten.
e !df -h
Rensar bufferten och lägger in resultatet av df -h.
Kommandotabell
Kommando | Beskrivning |
---|---|
(.)a | Append:a text till bufferten efter specifierad rad (efter den du är på om inget annat specifierats) |
(.,.c)c | Ersätter |
(.,.)d | Tar bort. |
e fil | Redigerar fil och sätter default-filnamnet. |
e !kommando | Redigerar outputen av kommandot. |
E fil | Samma som e, men osparade ändringar i bufferten tas bort utan varning. |
(1,$)g/regex/kommandolista | Kör kommandolista på specifierade raderna som matchar angivet regex. |
(1,$)G/regex/ | Redigerar varje matchande rad interaktivt; användaren frågas om vilket kommando som ska köras. |
H | Slår av/på utskrift av felmeddelandeförklaringar. |
h | Skriver ut förklaring av senaste felet. |
(.)i | Som append fast sätter in text innan specifierad rad. |
(.,.+1)j | Slår ihop rader. |
(.,.)l | Skriver ut en skärmlängd i taget och låter dig trycka <Enter> för att se nästa. |
(.,.)m(.) | Flyttar rader. |
(.,.)n | Skriver ut rader samt deras radnummer. |
(.,.)p | Skriver ut rader. |
P | Slår av/på kommandoprompten. Default är av. |
q | Avslutar. |
Q | Avslutar utan att varna om bufferten inte är sparad. |
($)r | fil Läser in fil. |
($)r | !kommando Läser in kommando. |
(.,.)s/sök efter/ersätt med/ | Söker efter rad som matchar angivet regex och ersätter första matchningen. |
(.,.)s/sök efter/ersätt med/g | Söker efter rad som matchar angivet regex och ersätter alla matchningar. |
(.,.)s/sök efter/ersätt med/n | Söker efter rad som matchar angivet regex och ersätter matchning nummer n. |
(.,.)s | Upprepar föregående substitution. |
(.,.)t(.) | Kopiera text. |
u | Ångra. Kommandona som kan ångras är a, c, d, g, G, i, j, m, r, s, t, v och V. |
(1,$)v/regex/kommandolista | Kör kommandolista på alla rader som inte matchar angivet regex. |
(1,$)V/regex/ | Redigerar interaktivt varje rad som inte matchar angivet regex. |
(1,$)w fil | Sparar hela bufferten eller specifierade rader till fil. |
(1,$)wq fil | Sparar och avslutar. |
(1,$)w !kommando | Sparar bufferten eller specifierade rader till kommandos standard-input. |
(1,$)W fil | Append:ar specifierade rader till slutet av fil. |
x F | Frågar om en krypteringsnyckel som sedan används i läsningar och skriviningar. |
(.+1)zn | Scrollar n rader åt gången. |
!command | Exekverar kommando genom sh. |
($)= | Skriver ut radnummer för raden i fråga. |
(.+1)newline | Skriver ut specifierad rad och sätter nuvarande rad till den. |
Externa länkar
- History of QED (http://cm.bell-labs.com/cm/cs/who/dmr/qed.html) av Dennis Ritchie
- Intervju (http://www.cs.pdx.edu/~kirkenda/joy84.html) med Bill Joy
- An Tutorial Introduction to the UNIX Text Editor (http://www.cs.bell-labs.com/7thEdMan/index.html) av Brian W. Kernighan
- man 1 ed (http://www.opengroup.org/onlinepubs/007908799/xcu/ed.html)
- Ed, man! !man ed (http://www.gnu.org/fun/jokes/ed.msg.html) - en lätt överentusiastisk text om ed:s stora fördelar gentemot andra editorer