Uwaga! To tłumaczenie może być
nieaktualne!
ed jest zorientowanym liniowo edytorem tekstu. Jest o
używany do tworzenia, wyświetlania, modyfikowania i innych
działań na plikach tekstowych. red to ed
zastrzeżony (restricted): może edytować tylko pliki z
bieżącego katalogu i nie może wykonywać komend
powłoki.
Po wywołaniu z argumentem pliku, jego kopia jest
odczytywana do bufora edytora. Wszelkie zmiany robione są na tej
kopii, nie na pliku jako takim. Podczas kończenia pracy z
ed, wszelkie zmiany, których nie zachowano komendą
`w' są tracone.
Edycja jest dokonywana w dwóch różnych
trybach: komend i wprowadzania. Po uruchomieniu, ed
jest w trybie komend. W trybie tym ze standardowego wejścia czytane
są komendy, a następnie są one wykonywane na
zawartości bufora edytora. Przykładowa komenda może
wyglądać tak:
,s/old/new/g
co zamienia wszystkie pojawienia się napisu old na
new.
Po podaniu komendy wprowadzania, takiej jak `a'
(append--dopisz), `i' (insert--wstaw) lub `c'
(change-zmień), ed wchodzi w tryb wprowadzania. Jest to
podstawowe narzędzie wprowadzania tekstu do pliku. W trybie tym nie
ma dostępnych żadnych komend. Zamiast tego, standardowe
wejście jest bezpośrednio zapisywane do bufora edytora. Linie
składają się z tekstu, aż do
(łącznie) znaku nowej linii. Tryb wprowadzania jest
przerywany wprowadzeniem pojedynczej kropki w linii.
Wszystkie komendy ed operują na całych
liniach, lub zakresach linii; np. komenda `d' kasuje (delete) linie;
komenda `m' przenosi linie, itp. Można też
modyfikować tylko część linii,
korzystając z narzędzi podmiany, podanych np. w
powyższym przykładzie. Jednak nawet tu, komenda `s'
tyczy się do całych linii naraz.
W ogólności, komendy ed
składają się z zera lub więcej adresów
linii, za którymi następuje pojedynczy znak komendy i
często dodatkowe parametry; komendy mają więc
strukturę:
[adres [,adres]]komenda[parametry]
Adresy wskazują linię, lub zakres linii,
których dotyczy komenda. Jeśli podano mniej adresów
niż potrzeba komendzie, używane są adresy
domyślne.
- -G
- Wymusza kompatybilność wsteczną. Dotyczy komend
`G', `V', `f', `l', `m', `t',
and `!!'.
- -s
- Powstrzymuje diagnostykę. Powinno być używane
jeśli standardowe wejście ed'a jest ze skryptu.
- -p łańcuch
- Podaje znak zachęty komend. Może to być
włączane, lub wyłączane komendą
`P'.
- plik
- Określa nazwę odczytywanego pliku. Jeśli plik
jest poprzedzony wykrzyknikiem (!), to jest interpretowany jak komenda
powłoki. W tym wypadku to, co jest czytane, jest standardowym
wyjściem pliku wywołanego przez sh(1). Aby
odczytać plik, którego nazwa rozpoczyna się od
wykrzyknika, poprzedź go odwrotnym ukośnikiem (\).
Domyślna nazwa pliku jest ustawiana na file tylko
jeśli nie jest poprzedzona wykrzyknikiem.
Adres reprezentuje numer linii w buforze. ed
obsługuje adres bieżący, który jest
zazwyczaj przekazywany komendom jako domyślny (w wypadku niepodania
tego argumentu). Podczas pierwszego odczytu pliku, adres
bieżący jest ustawiany na ostatnią linię.
Ogólnie, adres bieżący jest ustawiany na
ostatnią linię, dotkniętą przez
komendę.
Adres linii jest konstruowany z jednej z baz z poniższej
listy, za którą opcjonalnie może
następować offset numeryczny. Offsety mogą
zawierać dowolne kombinacje cyfr, operatorów (np. +,
- i ^) i białych spacji. Adresy są czytane od
lewej do prawej, a ich wartości są obliczane względem
adresu bieżącego.
Wyjątkiem reguły, że adresy
reprezentują numery jest adres address 0 (zero). Oznacza to
"przed pierwszą linią," i jest legalne tam gdzie ma
sens.
Zakres adresów to dwa adresy, oddzielone przecinkiem lub
średnikiem. Wartość pierwszego adresu w zakresie nie
może być większa od drugiego. Jeśli w zakresie
podany jest tylko jeden adres, to drugi adres jest ustawiany na podany.
Jeśli podano n-krotną parę adresów, gdzie
n > 2, to zakres jest określany przez ostatnie dwa adresy
zestawu. Jeśli oczekiwany jest tylko jeden adres, to używany
jest ostatni.
Każdy adres w zakresie przecinkowym jest interpretowany
względem adresu bieżącego. W zakresie
średnikowym, pierwszy adres jest używany do ustawienia adresu
bieżącego, a drugi względem pierwszego.
Rozpoznawane są następujące symbole
adresowe.
- .
- Adres bieżącej linii w buforze.
- $
- Adres ostatniej linii w buforze.
- n
- nta linia w buforze, gdzie n jest liczbą w zakresie
[0,$].
-
- ^
- Poprzednia linia. Jest to równoważne -1 i może
być powtarzane z rosnącym efektem.
-n
- ^n
- nta linia poprzednia, gdzie n jest liczbą
nieujemną.
- +
- Następna linia. Jest to równoważne +1 i
może być powtarzane z rosnącym efektem.
+n
- biała spacja
n
- nta następna linia, gdzie n jest liczbą
nieujemną. Biała spacja, za którą
następuje liczba n jest interpretowana jako +n.
,
- %
- Zakres od pierwszej do ostatniej linii. Jest to równoważne
1,$.
- ;
- Zakres od bieżącej do ostatniej linii. Jest to
równoważne .,$.
- /re/
- Następna linia, zawierająca wyrażenie regularne
re. Poszukiwanie gdy jest to konieczne, zakręca na
początek bufora i leci dalej aż do linii
bieżącej. // powtarza ostatnie szukanie.
- ?re?
- Poprzednia linia zawierająca wyrażenie regularne re.
Poszukiwanie gdy jest to konieczne, zakręca na koniec bufora i leci
aż do linii bieżącej. ?? powtarza ostatnie szukanie.
- ´lc
- Linia poprzednio zaznaczona przez komendę `k' (marK), gdzie
lc jest małą literą.
Wyrażenia regularne są wzorcami, używanymi w
wybieraniu tekstu. Na przykład, komenda ed
g/napis/
drukuje wszystkie linie, zawierające napis.
Wyrażenia regularne są używane też przez
komendę `s', gdzie wybierają stary tekst,
zastępowany nowym.
W dodatku do podawania napisów, wyrażenia regularne
mogą reprezentować klasy łańcuchów
znakowych. Łańcuchy tak reprezentowane będą
odpowiadać wyrażeniom regularnym. Jeśli jest
możliwe, by wyrażenie regularne dopasowało kilka
napisów w linii, to wybierane jest dopasowanie najbardziej z
lewej.
Do konstruowania wyrażeń regularnych używane
są następujące symbole:
- c
- Dowolny znak c nie wymieniony niżej, łącznie z
`{', '}', `(', `)', `<' i `>' oznacza samego siebie.
- \c
- Znak c
zacytowany lewym ukośnikiem, inny niż `{', '}', `(', `)',
`<', `>', `b', 'B', `w', `W', `+' i `?' oznacza
właśnie ten znak.
- .
- Oznacza pojedynczy znak. (dowolny)
- [klasa-znaków]
- Oznacza pojedynczy znak z klasy znaków. Aby do klasy
znaków włączyć `]', musi to być
pierwszy znak. Zakres znaków można przekazać,
rozdzielając jego końce znakiem `-', np. `a-z', który
oznacza wszystkie małe litery. Do podawania zestawów
znaków w klasie znaków można
używać następujących literałów:
[:alnum:] [:cntrl:] [:lower:] [:space:]
[:alpha:] [:digit:] [:print:] [:upper:]
[:blank:] [:graph:] [:punct:] [:xdigit:]
Gdy znak `-' pojawia się jako pierwszy lub ostatni znak
klasy-znaków, to dopasowuje sam siebie. Wszystkie inne
znaki klasy-znaków odpowiadają same sobie.
Wzorce w klasie-znaków postaci
[.col-elm.] lub
[=col-elm=]
gdzie col-elm jest elementem porównawczym
są interpretowane według locale(5) (nie jest to
obecnie obsługiwane). Zobacz regex(3) dla
objaśnień tych konstrukcji.
- [^klasa-znaków]
- Odpowiada dowolnemu pojedynczemu znakowi, innemu niż nowa linia,
który nie jest w klasie-znaków.
klasa-znaków jest definiowana podobnie jak wyżej.
- ^
- Jeśli `^' jest pierwszym znakiem wyrażenia regularnego, to
zaczepia wyrażenie regularne na początku linii. W przeciwnym
wypadku oznacza `^'.
- $
- Jeśli `$' jest ostatnim znakiem wyrażenia regularnego, to
doczepia wyrażenie regularne do końca linii. W przeciwnym
wypadku oznacza `$'.
- \(re\)
- Definiuje podwyrażenie re. Podwyrażenia mogą
być zagnieżdżane. Kolejne wsteczne odniesienia
postaci `\n', gdzie n jest cyfrą z zakresu [1,9],
rozwijają się do tekstu dopasowanego przez nte
podwyrażenie. Na przykład, wyrażenie regularne
`\(a.c\)\1' odpowiada napisowi `abcabc', lecz nie `abcadc'.
Podwyrażenia są porządkowane względem ich
lewego ogranicznika.
- *
- Odpowiada dopasowaniu poprzedzającego znaku lub podwyrażenia
zero lub więcej razy. jeśli '*' jest pierwszym znakiem
wyrażenia regularnego, lub podwyrażenia, to oznacza '*'.
Operator `*' daje czasem nieoczekiwane rezultaty. Na przykład
wyrażenie `b*' dopasowuje początek napisu `abbb',
według podnapisu `bbb'.
\{n,m\}
\{n,\}
- \{n\}
- Odpowiada poprzedzającemu jednoznakowemu wyrażeniu
regularnemu, lub podwyrażeniu, dopasowanemu przynajmniej n i
najwięcej m razy. Jeśli m jest
pominięte, to jest tylko dolne ograniczenie. Jeśli
pominięty jest też przecinek, dopasowanie wymaga
dokładnie n powtórzeń. Jeśli
któraś z tych postaci pojawi się na początku,
to jest interpretowana literalnie. Np. `\{2\}' odpowiada `{2}', itd.
\<
- \>
- Zaczepia wyrażenie znakowe, lub podwyrażenie do
początku (\<) lub końca (\>) słowa,
czyli w ASCII maksymalnego łańcucha znaków
alfanumerycznych, łącznie z podkreśleniem (_).
Następujące rozszerzone operatory są
poprzedzane lewym ukośnikiem, aby odróżnić je od
tradycyjnej składni ed.
\`
- \'
- Bezwarunkowo dopasowuje początek (\`) lub koniec (\') linii.
- \?
- Opcjonalnie odpowiada pojedynczemu znakowi, lub podwyrażeniu,
które go poprzedza. Np. wyrażenie `a[bd]\?c' odpowiada
`abc', `adc' i `ac'. Jeśli \? pojawia się na początku
linii, to jest traktowane literalnie jako `?'.
- \+
- Odpowiada pojedynczemu znakowi, lub podwyrażeniu,
poprzedzającemu go, a powtarzającemu się jeden, lub
więcej razy. Tak więc wyrażenie regularne `a+' jest
skrótem `aa*'. Jeśli \+ pojawi się na początku
linii, to odpowiada literalnemu `+'.
- \b
- Odpowiada początkowi lub końcowi (łańcuch
zerowy) słowa. Tak więc wyrażenie regularne
`\bhello\b' jest równoważne `\<hello\>'. Jednak,
`\b\b' jest prawidłowym wyrażeniem, podczas gdy `\<\>'
nim nie jest.
- \B
- Odpowiada (łańcuchowi zerowemu) w słowie.
- \w
- Odpowiada dowolnemu znakowi w słowie.
- \W
- Odpowiada dowolnemu znakowi nie będącemu w słowie.
Wszystkie komendy ed to pojedyncze znaki, choć
niektóre wymagają dodatkowych parametrów. Jeśli
parametry komendy rozciągają się na kilka linii, to
każda linia poza ostatnią, powinna być
zakończona lewym ukośnikiem (\).
Ogólnie, na linię dozwolona jest najwięcej
jedna komenda. Jednak większość komend przyjmuje
przyrostek drukowania, który może być dowolnym z
`p' (drukuj-print), `l' (listuj-list) , lub `n'
(wyliczaj-eNumerate), który drukuje ostatnią linię,
dotkniętą przez komendę.
Przerwanie (zwykle ^C) ma znaczenie przerywania
bieżącej komendy i powracania do trybu komend.
ed rozpoznaje następujące komendy. Komendy
pokazane są wraz z domyślnymi adresami, lub zakresami,
dostarczanymi gdy nie zostały podane (w nawiasach).
- (.)a
- Dokleja do adresowanej linii bufora linię, która może
być adresem zerowym. Tekst jest wstawiany w trybie wprowadzania.
Adres bieżący jest ustawiany na ostatnią
wprowadzoną linię.
- (.,.)c
- Zmienia linie w buforze. Adresowane linie są kasowane, a w ich
miejsce jest wklejany tekst. Tekst wprowadzany jest w trybie wprowadzania.
Bieżący adres jest ustawiany na ostatnią
wstawioną linię.
- (.,.)d
- Kasuje adresowane linie z bufora. Jeśli za skasowanym zakresem jest
linia, to bieżący adres jest na nią ustawiany. W
przeciwnym wypadku, jest ustawiany na linię przed skasowanym
zakresem.
- e plik
- Edytuje plik, i ustawia domyślną nazwę pliku.
Jeśli plik nie jest podany, używana jest
domyślna nazwa pliku. Wszelkie linie bufora są kasowane
przed odczytem nowego pliku. Bieżący adres jest ustawiany na
ostatnią odczytaną linię.
- e !komenda
- Edytuje standardowe wyjście `!komendy', (zobacz
!komenda niżej). Domyślna nazwa pliku nie jest
zmieniana. Wszelkie linie bufora są kasowane przed odczytaniem
wyjścia komendy. Bieżący adres jest ustawiany
na ostatnią odczytaną linię.
- E plik
- Edytuje bezwarunkowo plik. Jest to podobne do komendy e lecz
niezapisane zmiany są niszczone bez ostrzeżenia.
Bieżący adres jest ustawiany na ostatnią
odczytaną linię.
- f plik
- Ustawia domyślną nazwę pliku na plik.
Jeśli plik nie jest podany, drukowana jest niecytowana
domyślna nazwa pliku.
- (1,$)g/re/lista-komend
- Aplikuje list-komend do każdej linii, odpowiadającej
wyrażeniu regularnemu re. Bieżący adres jest
ustawiany na obecnie dopasowaną linię przed wykonaniem
listy-komend. Na końcu komendy `g' adres
bieżący jest ustawiany na ostatnią linię,
dotkniętą przez listę-komend.
Każda komenda w liście komend musi
być w oddzielnej liście, a każda linia poza
ostatnią musi być zakończona lewym
ukośnikiem (\). Dozwolone są wszystkie komendy poza
`g', `G', `v', i `V'. Nowa linia w
liście-komend jest równoważna komendzie
`p'.
- (1,$)G/re/
- Interaktywnie edytuje linie odpowiadające wyrażeniu
regularnemu re. Dla każdej linii, linia jest drukowana i
ustawiany jest adres bieżący, a użytkownik jest
pytany o wstawienie listy-komend. Na końcu działania
komendy `G', adres bieżący jest ustawiany na
ostatnią linię, dotkniętą przez
listę-komend.
Format listy-komend jest taki sam jak w `g'.
Samotna nowa linia działa jak zerowa lista komend. Pojedynczy
`&' powtarza ostatnią niezerową listę
komend.
- H
- Włącza drukowanie wyjaśnień
błędów. Domyślnie nie są one drukowane.
Zalecanym jest, by skrypty rozpoczynały się tą
komendą. Umożliwia to debuggowanie.
- h
- Drukuje objaśnienie ostatniego błędu.
- (.)i
- Wstawia tekst do bufora przed linię bieżącą.
Tekst jest wstawiany w trybie wstawiania. Bieżący adres jest
ustawiany na ostatnią wstawioną linię.
- (.,.+1)j
- Łączy adresowane linie. Adresowane linie są kasowane
z bufora i zamieniane przez pojedynczą linię,
zawierającą połączony tekst. Adres
bieżący jest ustawiany na wynikową linię.
- (.)klc
- Zaznacza linię małą literą lc. Linia
może być wtedy adresowana jako 'lc. Znaczenie nie
jest czyszczone aż do skasowania lub zmodyfikowania linii.
- (.,.)l
- Drukuje niedwuznacznie adresowane linie. Jeśli jest wywołany
z terminala, ed pauzuje na końcu każdej strony,
aż do wprowadzenia nowej linii. Bieżący adres jest
ustawiany na ostatnią drukowaną linię.
- (.,.)m(.)
- Przenosi linie w buforze. Adresowane linie są przenoszone za
prawostronny adres docelowy, który może być adresem
0 (zero). Bieżący adres jest ustawiany na
ostatnią przeniesioną linię.
- (.,.)n
- Drukuje adresowane linie wraz z ich numerami linii. Bieżący
adres jest ustawiany na ostatnią drukowaną linię.
- (.,.)p
- Drukuje adresowane linie. Jeśli jest wywołany z terminala,
ed pauzuje na końcu każdej strony aż do
wprowadzenia nowej linii. Bieżący adres jest ustawiany na
ostatnią drukowaną linię.
- P
- Włącza i wyłącza znak zachęty komend. O
ile nie był on określony opcją linii komend, -p
napis, to jest domyślnie wyłączony.
- q
- Kończy pracę z ed.
- Q
- Kończy pracę bezwarunkowo. Jest to podobne do komendy
q lecz niezapisane zmiany są niszczone bez
ostrzeżenia.
- ($)r plik
- Odczytuje file za adresowaną linię. Jeśli
plik nie jest podany, używana jest domyślna nazwa
pliku. Jeśli nie było wcześniej domyślnej
nazwy pliku, domyślna nazwa pliku jest ustawiana na plik. W
przeciwnym wypadku, domyślna nazwa pliku jest niezmieniana.
Bieżący adres jest ustawiany na ostatnią
odczytaną linię.
- ($)r !komenda
- Wczytuje za adresowaną linią wyjście
`!komendy', (zobacz !komenda niżej). Domyślna
nazwa pliku jest niezmieniona. Bieżący adres jest ustawiany
na ostatnią wczytaną linię.
(.,.)s/re/zamiana/
(.,.)s/re/zamiana/g
(.,.)s/re/zamiana/n
Zamienia tekst w adresowanych liniach, odpowiadający wyrażeniu
regularnemu re na zamianę. Domyślnie zamieniane
jest tylko pierwsze dopasowanie linii. Po podaniu przyrostka `g'
(global) zamieniane jest każde dopasowanie. Przyrostek `n',
gdzie n jest liczbą dodatnią, powoduje że
zmieniane jest tylko n-te dopasowanie. Błędem jest,
jeśli nie dokonano żadnych podstawień na żadnej
z adresowanych linii. Bieżący adres jest ustawiany na
ostatnią dotkniętą linię.
re i zamiana mogą być rozdzielane
dowolnym znakiem innym niż spacja i nowa linia (zobacz komendę
`s', niżej). Jeśli jeden, lub dwa z ostatnich
ograniczników są pominięte, to ostatnia
dotknięta linia jest drukowana tak, jakby podano przyrostek
`p'.
Niecytowany `&' w zamianie jest zamieniany na aktualnie
dopasowany tekst. Sekwencja `\m', gdzie m jest liczbą w
zakresie [1,9] jest zamieniana m-tą referencją
wsteczną wyrażenia dopasowanego tekstu. Jeśli
zamiana składa się z pojedynczego `%', to
używana jest zamiana z ostatniego podstawienia. W
zamianie można osadzać nowe linie po ich zacytowaniu
lewym ukośnikiem (\).
- (.,.)s
- Powtarza ostatnie podstawienie. Ta postać komendy `s'
przyjmuje przyrostek licznika `n', lub dowolną
kombinację znaków `r', `g', i `p'.
Jeśli podano przyrostek licznika `n', to zmieniane jest
tylko n-te dopasowanie. Przyrostek `r' powoduje, że
zamiast ostatnie podstawienia, używane jest wyrażenie
regularne ostatniego szukania. Przyrostek `g' włącza
przyrostek global ostatniego podstawienia. Przyrostek `p'
włącza przyrostek drukowania ostatniego podstawienia.
Bieżący adres jest ustawiany na ostatnią
dotkniętą linię.
- (.,.)t(.)
- Kopiuje adresowane linie za adres, wskazany z prawej strony, który
może być adresem 0 (zero). Bieżący
adres jest ustawiany na ostatnią kopiowaną linię.
- u
- Cofa ostatnią komendę i odtwarza bieżący adres
na taki, jaki był przed nią. Komendy globalne `g',
`G', `v', i `V'. są traktowane jako
pojedyncze. `u' jest samo dla siebie inwersją.
- (1,$)v/re/lista-komend
- Aplikuje listę-komend na każdej z adresowanych linii,
nie pasujących do wyrażenia regularnego re. Jest to
podobne do komendy `g'.
- (1,$)V/re/
- Edytuje interaktywnie adresowane linie, nie odpowiadające
wyrażeniu regularnemu re. Jest to podobne do komendy
`G'.
- (1,$)w plik
- Zapisuje adresowane linie do pliku. Wszelkie poprzednie
zawartości pliku są tracone bez ostrzeżenia.
Jeśli nie ma domyślnej nazwy pliku, to jest ona ustawiana na
plik, a w przeciwnym wypadku nie jest zmieniana. Jeśli nie
podano nazwy pliku, używana jest nazwa domyślna.
Bieżący adres nie jest zmieniany.
- (1,$)wq plik
- zapisuje adresowane linie do pliku, a następnie wykonuje
komendę `q'.
- (1,$)w !komenda
- Zapisuje adresowane linie na standardowe wejście `!komendy',
(zobacz !komenda niżej). Domyślna nazwa pliku i
bieżący adres nie są zmieniane.
- (1,$)W plik
- Dokleja adresowane linie do końca pliku. Jest to podobne do
komendy `w', lecz poprzednia zawartość pliku nie jest
niszczona. Bieżący adres nie jest zmieniany.
- (.)x
- Kopiuje (wstawia) zawartość bufora wycinania za
adresowaną linię. Bieżący adres jest ustawiany
na ostatnią skopiowaną linię.
- (.,.)y
- Kopiuje (wyszarpuje) adresowane linie do bufora wycinania. Bufor wycinania
jest nadpisywany przez dalsze wywołania `y', `s',
`j', `d', lub `c'. Bieżący adres nie
jest zmieniany.
- (.+1)zn
- Przewija n linii naraz, rozpoczynając od adresowanej linii.
Jeśli n nie jest podane, używany jest
bieżący rozmiar okna. Bieżący adres jest
ustawiany na ostatnią drukowaną linię.
- !komenda
- Wykonuje komendę poprzez sh(1). Jeśli pierwszy
znak komendy to `!', to jest on zamieniany tekstem poprzedniej
`!komendy'. ed nie przetwarza komendy w poszukiwaniu
cytatów lewoukośnikowych. Jedna niecytowany `%' jest
zamieniany domyślną nazwą pliku. Gdy powłoka
kończy wykonywanie, na standardowym wyjściu drukowany jest
`!'. Bieżąca linia nie jest zmieniana.
- (.,.)#
- Rozpoczyna komentarz; reszta linii, aż do nowej linii jest
ignorowana. Jeśli po adresie linii następuje średnik,
to bieżący adres jest ustawiany na ten adres. W przeciwnym
wypadku adres nie jest zmieniany.
- ($)=
- Drukuje numer linii adresowanej linii.
- (.+1)newline
- Drukuje adresowaną linię i ustawia bieżący
adres na tę linię.