Textový editor ed byl původně standardní součástí unixových operačních systémů. Naprogramoval jej Ken Thompson v r. 1969. Jako vůbec první textový editor umožnil ed použití regulárních výrazů. Předtím byl koncept regulárních výrazů rozpracován pouze na papíře. Ed byl inspirován starším textovým editorem QED, který byl vyvinut na Kalifornské univerzitě v Berkeley, kde Ken Thompson studoval. Na druhou stranu ed zase inspiroval vznik editoru ex z nějž pak vyšel dnes snad nejrozšířenější terminálový linuxový editor vi . A nechali se jím inspirovat i programátoři neinteraktivních unixových utilit grep, sed a awk .

Použití

editovat

V praxi se většinou ed používal v interaktivním režimu, ale nalezl využití i shellových skriptech. Při psaní a editování textu nejsou změny vidět - pracuje se s tzv. "adresovaným řádkem". Adresou takového řádku je jeho pořadové číslo od začátku souboru. Je-li jako adresa řádku udané pouze jedno číslo, pak příkaz zpracuje pouze řádek adresovaný touto hodnotou. V případě bloku řádků je adresa udána dvěma čísly, navzájem oddělenými čárkou.

Příklad:

user@stroj:~$  ed
a
Toto je první řádek nového textu.
Toto je druhý řádek nového textu.
.
2i
Tento text je vložen na pozici druhého řádku předchozího textu.
.
1,$l
Toto je první řádek nového textu.$
Tento text je vložen na pozici druhého řádku předchozího textu.$
Toto je druhý řádek nového textu.$
3s/druhý/třetí/
1,$l
Toto je první řádek nového textu.$
Tento text je vložen na pozici druhého řádku předchozího textu.$
Toto je třetí řádek nového textu.$
w text.txt
132
q
user@stroj:~$

a - příkaz pro začátek psaní textu

. - tečkou se vždy ukončí psaní textu

2i - příkaz který znamená "vpisuj následující data od řádku č.2"

1,$l - příkaz který znamená "vypiš text od řádku č.1 s vypsanými znakovými entitami a konci řádku"

3s/druhý/třetí/ - příkaz který znamená "nahraď na třetím řádku slovo druhý za třetí"

w text.txt - příkaz pro zapsání textu do souboru "text.txt" (po jeho vykonání se zobrazí počet zapsaných znaků)

q - příkaz pro ukončení práce s editorem

Příkazy pro práci se souborem

editovat

Během editace ed nepracuje se souborem jako takovým, ale jeho kopií v tzv. bufferu. Změny se do výchozího souboru dostanou teprve po zapsaní příkazem "w"

Příkaz Příklad použití Popis
e
e soubor.txt
e ! ls /home/user
Tento příkaz nahradí obsah aktuálního bufferu obsahem souboru soubor.txt. Pokud se zadá příkaz bez parametru, pak se použije naposledy použité jméno souboru. V případě že žádný název souboru ještě nebyl použit skončí pokus o realizaci příkazu chybou. Výjimkou je použití speciálního příkazu ! (viz druhý řádek příkladu použití příkazu) kdy se předá část za vykřičníkem k realizaci shellu a do bufferu je pak vložen výsledek realizovaného skriptu. V tomto případě je obsah bufferu nahrazen výpisem obsahu adresáře /home/user.
f
f novysoubor.txt
Tímto příkazem nastavíme jméno souboru. V případě že zadáme příkaz bez parametru vrátí aktuálně platné jméno. Příkaz se také používá chceme-li obsah bufferu uložit do jiného souboru.
r
r pripoj.txt
r ! ls /home/user
Tímto příkazem připojíme k aktuálnímu obsahu bufferu obsah souboru určeného parametrem. Není-li tento parametr uveden, pak se použije naposledy použité jméno souboru. Výjimkou je použití speciálního příkazu ! (viz druhý řádek příkladu použití příkazu) kdy se předá část za vykřičníkem k realizaci shellu a k obsahu bufferu je pak připojen výsledek realizovaného skriptu. V tomto případě je k obsahu bufferu přidán výpis obsahu adresáře /home/user
w
w soubor.txt
Příkaz pro zapsání obsahu bufferu do souboru. Pokud se neuvede parametr s názvem souboru, pak se použije nastavené jméno souboru. Pokud žádné jméno nastavené není, skončí pokus o realizaci příkazu chybou.

Editační příkazy

editovat

Pozn.: Každý editační příkaz se ukončuje příkazem tečka - .

Příkaz Příklad použití Popis
a
a
Po zadání příkazu se pak píše
vlastní text, a to do té doby,
dokud není jako první znak na
řádku zadána a "odklepnuta"
tečka
.
0a
Byla-li zadána adresa řádku,
pak je text vložen za tento
řádek.
. 
příkaz pro vložení textu za aktuální adresovaný řádek. Akceptuje i adresu 0, text se pak vkládá před první řádek. Maximální délka řádku vkládaného tímto způsobem byla dříve omezená na 256 znaků.
c
5c
Byla-li zadána pouze adresa
jednoho řádku, pak je tímto
blokem textu nahrazen řádek
č.5
.
1,5c
Pokud byly zadány adresy dvě,
pak je nahrazen tímto textem
blok textu vymezený prvním
až pátým řádkem
.
příkaz pro nahrazení adresovaných řádků (lze adresovat nejenom jeden řádek, ale i celý blok textu) novým textem
i
i
Příkaz i funguje stejně
jako příkaz a, pouze s tím
rozdílem, že je tento blok
textu vložen PŘED řádek
určený adresou. Jelikož v
tomto příkladu žádná adresa
uvedena nebyla, tak bude
tento text vložen před
poslední adresovaný řádek
.
příkaz pro vkládání textu. Je podobný příkazu a, jen s tím rozdílem, že se text vkládá před naposledy adresovaný řádek, nikoliv za.
d
1,5d
Příkaz pro smazání řádku, nebo bloku řádků (podle toho, je-li zadána pouze jedna adresa, nebo dvě adresy). V uvedeném příkladu došlo v bufferu k vymazání řádků 1 až 5.
m
3,9m2
Příkaz pro přesun adresovaných řádků. Řádek, nebo blok řádků vymezený adresami před příkazem je přesunut za řádek udaný adresou za příkazem m. V případě adresy 0 pak text přesunut před první řádek textu v bufferu. Pokus o přesun bloku textu na adresu vymezenou jeho rozsahem skončí oznámením chyby.
t
3,9m2
Příkaz pro zkopírování adresovaných řádků. Řádek, nebo blok řádků vymezený adresami před příkazem je zkopírován za řádek udaný adresou za příkazem t. V případě adresy 0 pak text zkopírován před první řádek textu v bufferu.
j
5,9j
Příkaz pro sloučení po sobě jdoucích řádků do jednoho. Podmínkou je zadání adresy řádku od kterého má slučování začít, a zároveň adresu posledního slučovaného řádku, nestane-li se tak, pak k žádnému sloučení nedojde. Příkaz uvedený v příkladu způsobí sloučení řádků 5 až 9 do jednoho.

Nahrazovací příkazy

editovat

Pozn: Místo zkratky RE se v příkazech použije regulární výraz

Příkaz Příklad použití Popis
g/RE/<seznam příkazů>
1,$g/^Pr/
Příkaz provádí hromadné akce nad obsahem bufferu vymezeným adresou, resp. adresami řádků. První příkaz musí začínat na stejném řádku, případné další příkazy pak musí končit obráceným lomítkem. V seznamu příkazů se nesmí vyskytnout g,G,v a V
/RE/<náhrada>/<parametr>
1,$p
nahradit jedno slovo
nahradit druhé slovo
nahradit třetí slovo
1,3s/druhé/další/
1,$p
nahradit jedno slovo
nahradit další slovo
nahradit třetí slovo
1,3s/další/\
/
1,$p
nahradit jedno slovo
nahradit další
 slovo
nahradit třetí slovo
Příkaz provádí nahrazování řetězců na řádcích v daného rozsahu adres. Na místě parametru lze uvést buďto znak "g" (pak jsou nahrazeny všechny výskyty), číslici (pak se nahradí n-tý výskyt vzorku na řádku) nebo nic (pak je nahrazen pouze první výskyt vzorku). Objeví-li se v řetězci <náhrada> znak "&", dojde k jeho nahrazení řetězcem, který vyhovoval vzorku RE; Je-li místo řetězce <náhrada> uveden pouze znak "%" pak se použije pro nahrazení řetězec z dříve použitého příkazu nahrazení; Také lze pomocí tohoto příkazu rozdělit řádek na dva (a více) a to tak, že v řetězci <náhrada> uvedeme znak "\", vložíme konec řádku (ENTER) a ukončíme příkaz pro nahrazení.
v/RE/<seznam příkazů>

Zobrazovací příkazy

editovat

Skok na řádek se provádí pouhým zapsáním adresy řádku, pomocí klávesy ENTER pak lze procházet souborem

Příkaz Příklad použití Popis
=
=
4
Příkaz vypíše adresu posledního řádku
l
1,2l
Obsah prvn\355 \370\341dky$
obsah druh\351 \370\341dky$
Příkaz vypíše adresované řádky tak, že netisknutelné znaky vypíše oktálovou hodnotou, rozloží dlouhé řádky a vyznačí konec řádku znakem $. Lze jej použít za všemi příkazy, vyjma e,f,r a w
n
1,2n
1       Obsah první řádky
2       obsah druhé řádky
Příkaz vypíše adresované řádky, s tím že na začátku bude vždy číslo řádku, oddělené od textu znakem tabulátor. Lze jej použít za všemi příkazy, vyjma e,f,r a w
p
1,2p
Obsah první řádky
obsah druhé řádky
Příkaz vypíše adresované řádky. Lze jej použít za všemi příkazy, vyjma e,f,r a w

Pozn: Pro výpis celého souboru se používá rozsah adres 1,$ - tedy od prvního řádku do konce souboru

Další příkazy

editovat
Příkaz Příklad použití Popis
!
f novysoubor.txt
! ls %
ls: novysoubor.txt: není souborem ani adresářem
Příkaz předá řetězec za vykřičníkem k provedení shellu, předtím však případný znak procento nahradí aktuálně používaným názvem souboru (nemá-li být tento znak expandován, a má se použít jako znak, musí být uvozen zpětným lomítkem). Užitečný je tento příkaz zvláště tehdy, potřebujeme-li ověřit před uložením, zdali již soubor s námi zvoleným názvem neexistuje.
P
P
*
Zapne zobrazování příkazového řádku. Tj. příkazový řádek je od řádku editačního odlišen tím, že začíná znakem * (Vypne se to novým zadáním příkazu)
h
?
h
Invalid adress
Vypíše podrobnější vysvětlení chyby oznámené znakem ?
q
q
user@stroj:~/$
Příkaz ukončí práci s editorem ed (Pokud se použije Q tak se přitom zahodí veškeré změny)

Použití editoru ed ve skriptu

editovat

Editor ed lze používat nejenom jako interaktivní editor pro editaci textu, ale také ve skriptech, pro dávkové zpracování. Příklad jednoduchého skriptu, který otevře soubor a nahradí v něm všechny výskyty řetězce AAAA za řetězec BBBB:

#!/bin/bash
ed soubor.txt 2> /dev/null <<-EOF
    1,\$s/AAAA/BBBB/g
    w
    q
EOF
echo "Konec skriptu"

Co se vlastně po spuštění skriptu děje?

"Skript spustí editor ed, načte do bufferu obsah souboru soubor.txt, a zpracovává jej dokud nenarazí na konec souboru (EOF). Eventuální chybové hlášky posílá do /dev/null. Prvním příkazem provede náhradu, pak obsah bufferu uloží zpátky do souboru soubor.txt a ukončí ed. Ovšem aby skript pokračoval výpisem na standardním výstupu, musí následovat řetězec EOF, jinak bude výpis rovněž směrován do /dev/null"

Pozn.: Obrácené lomítko před $s je umístěno proto, aby nedošlo k expanzi příkazu jako proměnné.