Editor ed

Editor ed je jeden z nejstarších linuxových nástrojů. Jedná se o tzv. řádkový editor. (Opakem budiž editor vim, který je celoobrazovkový editor.)

Tento editor asi běžně používat nebudete. Práce s ním je až příliš drsná. Ed vznikl v prehistorických dobách výpočetní techniky, kdy byl celoobrazovkový editor příliš náročnou aplikací. Ed se může hodit při editaci na vzdáleném počítači, pokud máte extrémě pomalé připojení (a to určitě nemáte). Taky se může hodit na editaci extrémě velkých souborů, případně se dá použít ve skriptech na neinteraktivní editaci souborů (podobně jako sed).

Význam programu ed není jen historický. Z tohoto editoru vychází příkazová řádka ve vimu ex, program sed inspiroval i vývojáře programuu grep a dalších. Pokud umíte pracovat s programem sed a s příkazovou řádkou ex ve vimu, pak si ed určitě zamilujete :-).
Editor ed je navíc součástí každého Linuxu. Je dokonce pravděpodobnější, že budete mít na Linuxu nainstalovaný ed, než vim. Každý správný linuxák umí používat ed!

V editoru ed neuvidíte na obrazovce celý dokument, jako v běžných celoobrazovkových editorech. Místo toho uvidíte jen příkazovou řádku, která očekává nějaké příkazy.
Jedním z ních může být příkaz p, který vám vytiskne část dokumentu na obrazovku. Kterou část vytiskne se zadává tzv. adresou, která se uvádí před každým z příkazů, který adresu očekává.

1,$p
1,$ je rozsah od první řádky (1) do poslední ($). Příkaz p je příkaz pro vytištění řádků na obrazovku.

Spuštění a ukončení editoru

Editor se spustí zadáním příkazu ed. Jako argument programu ed se mu může předat název souboru, který má editovat. Editor se ukončí příkazem q. Před ukončením se by se měli ještě zapsat provedené změny příkazem w.

SYNOPSIS

ed [-q:] [soubor]

OPTIONS

-q:
Nastaví jako prompt zadaný znak (:). Normálně ed žádný prompt nezobrazuje.

EXAMPLES

$ ls
$ ed test.txt
test.txt: Adresář nebo soubor neexistuje
w
0
q
$ ls
test.txt

Nápověda

Pokud zadáte editoru špatný příkaz (něco, čemu nerozumí), zobrazí ed pouze otazník. Pro začátek se vám bude hodit trochu ukecanější výstup. Ten zapnete příkazem H (velké H, ed je case-sensitive).

Editor ed si moc nerozumí s klávesami backspace a delete. Pokud nějaký zadávaný příkaz editujete těmito klávesami, může se stát, že i když výsledný příkaz zadáte správně, ed si bude stěžovat, že příkazu nerozumí (Unknown command).
$ ed test.txt
0
1,$p
?
H
Invalid address
1,$p
?
Invalid address
q
$

V příkladu se otevírá existující soubor test.txt. Program ed zobrazí jeho velikost (0 bajtů). Příkazem 1,$p se pokouším vypsat obsah souboru od první do poslední řádky. Jenomže soubor je prázdný, takže nemá prázdvní řádku a adrsa je tak neplatná. Při prvním pokusu ed vypíše pouze otazník. Příkazem H se vypíše text poslední chyby a zapne se ukecaný režim. Od této chvíle se text chyby zobrazí automaticky.
Příkaz q ukončí editor.

Pokud chcete zobrazit jen poslední hlášku a nechcete zapínat hlášky pro všechny chyby, použíjte příkaz h (malé h).

Vložení textu

K vložení textu slouží příkaz i (insert).

Vkládání textu začíná na tzv. aktuální řádce, což je místo za poslední upravovanou řádkou, případně konec souboru po otevření nového souboru.

Vkládání textu se provádí řádek po řádce. Jakmile řádek ukončíte (klávesou Enter), můžete editovat během psaní textu jen další řádku. Zadávání textu se ukončí tečkou na samostatném řádku.

$ ed test.txt
0
i
Ahoj, já jsem první řádka.
Ahoj, já jsem druhá řádka.
A já sem třetí, zatím poslední.
.
w
99
q
$

V příkladu jsem otevřel prázdný soubor test.txt. Příkazem i jsem přešel do „insert módu“. Pak jsem zadal 3 řádky a insert mód jsem ukončil tečkou na samostatném řádku. Následuje příkaz pro zapsání změn (w) a ukončení editoru (q). Není to zase tak těžké, že? :-)

Před příkazem i může být číslo řádky (adresa), kde se má text začít psát. Všechny další řádky se automaticky posunou níže. Krom toho existuje ještě příkaz a (append), který zadává text za řádku, kterou zadáte v adrese. Jinak je to to samé, jako i.

$ ed test.txt
99
1i
Já jsem nová první řádka.
.
1,$p
Já jsem nová pvrvní řádka.
Ahoj, já jsem první řádka.
Ahoj, já jsem druhá řádka.
A já sem třetí, zatím poslední.
1a
Já jsem nová druhá řádka.
.
1,$p
Já jsem nová pvrvní řádka.
Já jsem nová druhá řádka.
Ahoj, já jsem první řádka.
Ahoj, já jsem druhá řádka.
A já sem třetí, zatím poslední.
Q

Příkaz Q ukončí editor, aniž by zapsal změny.

Zadávání adresy

Pokud před příkazem nezadáte žádnou adresu, příkaz se vykoná na aktuální řádce. Aktuální řádka je po spuštění editoru poslední řádka v souboru. Při provedení příkazu je aktuální řádkou řádek za posledním ovlivněným (zadaným) řádkem.

Adresou můžete zadat buďto jednu řádku, nebo rozsah řádek (od - do). Jedna řádka může být adresována jedním z následujících způsobů:

AdresaVýznam
nn je číslo, které určuje číslo řádky
-nAdresa je řádka předcházející aktuální řádce o "n" řádek
+nAdresa je řádka o "n" řádek dále.
.Tečka představuje aktuální řádku (totéž jako byste neuvedli žádnou adresu).
$Poslednní řádka v souboru
/regexp/Odpovídá první následující řádce v souboru, která odpovídá regulárnímu výrazu
?regexp?Odpovídá první předchozí řádce v souboru, která odpovídá regulárnímu výrazu
g/regexp/Odpovídá všem řádkám v souboru, které odpovídají regulárnímu výrazu
g?regexp?Odpovídá všem řádkám v souboru, které odpovídají regulárnímu výrazu

Rozsah řádek se zadává jako první adresa, čárka, druhá adresa.

1,$

1,$ je adresa pro první až poslední řádku, tedy celý soubor.

Abyste si nemuseli pracně počítat čísla řádek, můžete si soubor vypsat s čísli řádek před každou řádkou. A to příkazem n. (Funguje stejně jako příkaz p, jen přidává čísla řádek.)

$ ed test.txt
99
1,$n
1       Ahoj, já jsem první řádka.
2       Ahoj, já jsem druhá řádka.
3       A já sem třetí, zatím poslední.
.n
3       A já sem třetí, zatím poslední.
1n
1       Ahoj, já jsem první řádka.
.n
1       Ahoj, já jsem první řádka.
1,2n
1       Ahoj, já jsem první řádka.
2       Ahoj, já jsem druhá řádka.
-1,+1n
1       Ahoj, já jsem první řádka.
2       Ahoj, já jsem druhá řádka.
3       A já sem třetí, zatím poslední.
-1,.n
2       Ahoj, já jsem druhá řádka.
3       A já sem třetí, zatím poslední.
q
$

Všiměte si, jak se chová -1. Je to relativní adresa. Při prvním použití byl aktuální řádek 2, proto rozsah začíná řádkem 1, zatímco při druhém použití byl aktuální řádek 3 a tak začíná rozsah řádkem 2.

Adresu lze použít i s příkazy, kde byste to nečekali. Například s příkazem pro zápis souboru w.

$ ed test.txt
99
1,2w test12.txt
62
q
$ cat test12.txt
Ahoj, já jsem první řádka.
Ahoj, já jsem druhá řádka.
$

Aktuální řádku můžete změnit i tím, že zadáte jen adresu nové řádky. Například zadáním 2 se stane aktuální řádkou řádek 2, zadáním -2 se stane aktuální řádkou řádek o 2 řádky výše atd.

Editace řádky

Protože je editor ed řádkový editor, nemůžete jen tak změnit kus řádky. Řádku změníte buď tak, že jí celou smažete (příkazem d), nebo použijete regulární výraz na nahrazení kusu textu, podobně jako v editoru ex ve VIMu.

Regulární výraz se zapíše tak, že nejdříve napíšete adresu, pak s (substitute), lomítko, regulární výraz, další lomítko a nahrazující text.

Stejně jako ve VIMu platí, že v nahrazovacím textu můžete použít & pro vložení nalezeného textu, případně \1 pro nahrazení obashu první závorky v reg. výrazu atd. Pokud chcete někde použít lomítko, použijete escape sekvenci \/ (zpětné lomítko před lomítkem).

$ ed test.txt
99
1,$p
Ahoj, já jsem první řádka.
Ahoj, já jsem druhá řádka.
A já sem třetí, zatím poslední.
1,2s/Ahoj, j\(.*\)\./J\1, ahoj.
Já jsem druhá řádka, ahoj.
1,$p
Já jsem první řádka, ahoj.
Já jsem druhá řádka, ahoj.
A já sem třetí, zatím poslední.
Q

Příkaz s vypíše poslední změněnou řádku, pokud jej neukončíte lomítkem /.

Příkaz substituce nahradí pouze první výskyt nalezeného řetězce na řádce. Pokud chcete nahradit každý výskyt, musíte použít modifikátor g, který se píše za lomítko na konec výrazu.

$ ed test.txt
99
3p
A já sem třetí, zatím poslední.
3s/./@/
3p
@ já sem třetí, zatím poslední.
3s/./@/g
3p
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Q
Tečka v regulárním výrazu znamená libovolný znak.

Jak zapsat tečku na samostatném řádku

Protože tzv. „insert mód“ se ukončuje tečkou na konci řádku, jak takovou samostatnou tečku na řádku v editoru ed napsat?

Řešení vás možná už napadlo. Použijete příkaz substituce. Nejdříve napíšete řádku s nějakým zástupným textem (třeba i prázdnou) a pak celou řádku nahradíte v substituci tečkou.

Substitucí můžete napsat hned několik teček na samostatném řádku zasebou.

$ ed
i
Nejaky text.
-
Nejaky dalsi text.
-
.
1,$p
Nejaky text.
-
Nejaky dalsi text.
-
1,$s/-/.\
.\
./
1,$p
Nejaky text.
.
.
.
Nejaky dalsi text.
.
.
.
Q
$

Všiměte si, jak jsem zadával v substituci nový řádek. Napsal jsem zpětné lomítko \ a stiskl Enter. (Pak tečku, zpětné lomítko a zase Enter …). Poslední (normální) lomítko v příkazu substituce ukončuje nahrazovací text.

Seznam příkazů editoru ed

Tento seznam není úplný, pro všechny příkazy se podívejte do manuálové stránky. Některé příkazy už znáte, jiné si už určitě dokážete sami vyzkoušet. I když to u příkazů nebudu psát, mějte na paměti, že je můžete používat s adresou řádků, na kterých se mají aplikovat.

w [soubor]
Zapíše buffer do souboru.
q
Ukončí editor, pokud nejsou v bufferu nějaké neuložené změny.
Q
Ukončí editor, neuložené změny se zahodí.
p
Vytiskne řádky na obrazovku.
n
Vytiskne řádky na obrazovku. Před každým řádkem zobrazí jeho pořadové číslo.
i
Spustí vkládací mód, ve kterém se zadávají nové řádky. Vkládací mód se ukončí tečkou na samostatném řádku (insert).
a
To samé jako i, jenom začne zadávat text pod řádkem adresy (append).
s
Substituce obsahu pomocí regulárních výrazů
d
Smaže řádky (delete).
c
Změní řádky (change). To samé, jako by se řádky nejdříve smazali pomocí d a pak se přešlo do vkládacího módu.
m adresa
Přesune (move) řádky za adresu.
t adresa
Zkopíruje řádky za adresu.
j
Spojí (join) řádky dohromady.
r soubor
Načte obsah souboru do aktuálního bufferu.
r ! cmd
Připojí výstup z přikazu cmd do aktuálního bufferu.
! cmd [%]
Spustí příkaz cmd v shellu. Nepovinný argument % se nahradí jménem aktuálně editovaného souboru.

Závěr

Na závěr si zasloužíte takový malý žertík.

Tato kapitola byla napsána v editoru ed.

Komentář Hlášení chyby
Created: 13.7.2013
Last updated: 13.7.2013
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..