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á.
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
$ 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).
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).
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.
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
.
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ů:
Adresa | Význam |
---|---|
n | n je číslo, které určuje číslo řádky |
-n | Adresa je řádka předcházející aktuální řádce o "n" řádek |
+n | Adresa 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,$
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.)
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
.
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).
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.
99
3p
A já sem třetí, zatím poslední.
3s/./@/
3p
@ já sem třetí, zatím poslední.
3s/./@/g
3p
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Q
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.
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
.