Ed
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 | editovat zdroj]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 | editovat zdroj]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 | editovat zdroj]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 | editovat zdroj]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 | editovat zdroj]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 | editovat zdroj]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 | editovat zdroj]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é.