Ed

Z Wikiknih
Skočit na navigaci Skočit na vyhledávání

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é.