ED(1) — NEWS-OS Programmer’s Manual
名称
ed − テキストエディタ
形式
ed [ − ] [ name ]
解説
ed は、標準テキストエディタです。
name の引数が与えられると、 ed は指定されたファイルに対して e コマンド(後述)をシミュレートします。 つまり、 ed のバッファにファイルが読み込まれ、 編集することができるようになります。 − オプションは、 説明のための出力表示を抑制するものであり、 標準入力がエディタスクリプトである場合に使用してください。
ed は、編集するファイルのコピーに対して働きます。コピーに加えられた変更は、 w (書込み)コマンドが実行されるまでは、ファイルには何も影響を及ぼしません。 編集されるテキストのコピーは、バッファと呼ばれる 一時的なファイルにあります。
ed に対するコマンドはシンプルで一定の構造を持っています。 ゼロまたはそれ以上の数のアドレスのあとに単一キャラクタのコマンドが続き、 そのコマンドのパラメータがそのあとに続きます。アドレスは、 バッファ内の 1 つまたは複数の行を指定します。 必要なアドレスが指定されなければ、デフォルトのアドレスが使われます。
通常、1 行に 1 個のコマンドを指定することができます。 いくつかのコマンドは、 バッファにテキストを追加するために使用することができます。 ed がテキストを受け入れている間は、「入力モード」になっている といいます。 このモードにあるときには、コマンドは受け付けられません。 全ての文字がそのまま入力されます。入力モードは、行の先頭に . を 1 つだけタイプすることによって、入力モードから抜けることができます。
ed は、正規表現の表記法の一部の形式をサポートしています。正規表現は、 文字列の集合を指定します。 この文字列の集合の 1 要素は正規表現に一致するといいます。 以下の正規表現の指定では、「キャラクタ」という 単語は、復帰改行以外のキャラクタを意味しています。
1.特殊文字以外のキャラクタは、それ自体と一致します。特殊文字には、 正規表現のセパレータのほかに、 \、[、. があり、 ^、∗、$ も特殊文字として扱われることがあります。
2.. はどのキャラクタにも一致します。
3.\ の後ろに、数字または ( ) 以外のキャラクタを付けたものは、 そのキャラクタに一致します。
4.空でない文字列 s を大かっこ [ ] でくくった [s] (または [^s] ) は、 s 内 (または s 外) のどのキャラクタにも一致します。 s 内では、 \ は特別な意味は持たず、 ] は先頭のキャラクタとして だけ使用することができます。 a と b が 文字コードの昇順になっている部分文字列 a−b は、その両端のキャラクラを含む範囲を意味します。
5.∗ が後ろに付けられた形式 1−4 の正規表現は、その正規表現をゼロまたは それ以上の回数繰り返したものに一致します。
6.形式 1−8 の正規表現 x が \( と \) で囲まれたもの \(x\) は、 x が一致するものに一致します。
7.\ の後ろに数字 n を付けたものは、 \( と \) で囲まれた正規表現がいくつかあって、 その n 番目のものと一致した文字列に一致します。
8.形式 1−8 の正規表現 x と形式 1−7 の正規表現 y を並べたものは、 x に一致するものと y に一致するものを並べたものに一致しますが、 この場合、 x に一致するものは y の一致も認めた上で、 できる限り長いものとなります。
9.^ が前に付けられた(または $ が後ろに付けられた)形式 1−8 の正規表現は、 行の左端で始まる(または右端で終わる)一致に制約されます。
10.形式 1−9 の正規表現は、1 行内の最左端の一致の中で最も長いものを選びます。
11.空の正規表現は、直前に遭遇した正規表現と同じものを意味します。
正規表現は、行を指定するアドレス、および置き換えられる行の 一部分を指定する 1 つのコマンド(後述の s 参照)でも使用されます。 正規表現のメタキャラクタのうちの 1つを普通のキャラクタとして 使用したい場合には、そのキャラクタの前に \ を付けることができます。 これは、正規表現を区切るキャラクタ(一般的には /) および \ 自体にも適用できます。
ed におけるアドレス指定を理解するには、現在行(current line)が常に 存在することを知っておかなければなりません。一般的に言って、現在行は、 コマンドによって最後に作用を受けた行のことです。現在行に対する具体的な 作用については、コマンドの説明で述べられています。アドレスは、 次にように構成されます。
1.キャラクタ . は、現在行を指します。
2.キャラクタ $ は、バッファの最終行を指します。
3.10進数 n は、バッファ内の n 番目の行を指します。
4.’x は、名前 x でマークされている行を指します。 x は 1 個の小文字でなければなりません。 行は、後述の k コマンドでマークされます。
5.スラッシュ / で囲まれた正規表現は、現在行から順方向にサーチを行い、 その正規表現に一致する文字列を含んだ最初の行で停止することによって 見つけた行を指します。サーチはバッファの先頭に戻って現在行まで継続して 行われます。
6.疑問符 ? で囲まれた正規表現は、現在行から逆方向にサーチを行い、 その正規表現に一致する文字列を含んだ最初の行で停止することによって 見つけた行を指します。 必要ならサーチはバッファの終端に戻って現在行まで継続して行われます。
7.そのあとにプラス符号 + またはマイナス符号 − と 10進数の続いているアドレスは、 そのアドレスに 10進数で示された行数を加える(または差し引く)ことを 指定します。プラス符号は省略することができます。
8.アドレスが + または − で始まっている場合には、 現在行に対して加算または減算が行われます。 例えば、 −5 は、 .−5 を意味するものと見なされます。
9.アドレスが + または − で終わっている場合には、 アドレスに対して 1 の加算(または減算)が行われます。 この規則と上記の 8 の規則の結果として、 アドレス − は、現在行の 1 つ前の行を指すことになります。 また、後続の + および − キャラクタには累積効果があるので、 −− は、現在行 マイナス 2 を意味します。
10.エディタの旧バージョンとの互換性を保つために、 アドレス内のキャラクタ ^ は、 − に相当します。
コマンドは、ゼロ または、1 個、2 個のアドレスを必要とします。 アドレスを必要としないコマンドは、アドレスが指定されるとエラーと見なします。 1 個または 2 個のアドレスを受け付けるコマンドは、 指定されたアドレスが不足していると、デフォルトのアドレスを使用します。 コマンドが必要とする個数以上のアドレスが指定された場合には、 最後の 1 個または 2 個 (受け付けられるものによって違う)のアドレスが 使用されます。
通常、 アドレスは互いにコンマ , で区切られますが、セミコロン ; で区切ることもできます。 セミコロンで区切られた場合には、現在行 . は、 次のアドレスが解釈される前に直前のアドレスにセットされます。 この機能は、順方向および逆方向へのサーチ (/、?) での 開始行を決定するために使用することができます。 2 アドレスのシーケンスの第 2 アドレスは、 第 1 アドレスに対応する行より後ろの行に対応していなければなりません。 特殊な形式 % は、アドレスのペア 1,$ の省略形です。
以下の ed のコマンドのリストでは、デフォルトのアドレスを、 かっこで囲んで示してあります。かっこはアドレスの一部ではなく、 それがデフォルトのアドレスであることを示しています。
既に述べたように、普通、1 行に複数のコマンドが存在することは 認めらていませんが、大部分のコマンドでは、そのあとに p または l を付けることができます。だだし、その場合には、 後述の要領で現在行がそれぞれ表示またはリストされます。
(.)a
text
.
append コマンドは、与えられたテキストを読み取り、それをアドレス指定された 行のあとに追加します。 . は、最後に入力された行、または 挿入された行がない場合には、アドレス指定された行に置かれます。 このコマンドでは、アドレス 0 が認められています。その場合、 テキストはバッファの先頭に入れられます。
(.,.)c
text
.
change コマンドは、アドレス指定された行を削除し、 それらの行と置き換えられる入力テキストを受け付けます。 . は、入力された最後の行、 または入力された行がない場合には、削除された行の直前の行に置かれます。
(.,.)d
delete コマンドは、アドレス指定された行をバッファから削除します。 削除された最後の行の次の行が現在行になります。削除された行が元々 バッファの終わりにあった場合には、新たに最終行になった行が 現在行になります。
e filename
edit コマンドは、バッファの全内容を削除し、指定されたファイルを読み取ります。 . はバッファの最終行にセットされます。読み取られたキャラクタの数が 表示されます。
filename は、あとで r または w コマンドでデフォルトの ファイル名として使用される場合に備えて記憶されます。 filename が指定されない場合には、記憶されている名前が使用されます。
E filename
このコマンドは、バッファの最後の変更以降に w が実行されていないと診断がないという点を除き、 e コマンドと同じです。
f filename
filename コマンドは、現在記憶されているファイル名を表示します。 filename が指定された場合には、現在記憶されているファイル名が指定した filename に変更されます。
(1,$)g/regular expression/command list
global コマンドは、第 1 ステップで指定された正規表現に 一致するすべての行をマークします。次に、それらの各行について、 当初その行にセットされている . で、与えられたコマンドの並びが実行されます。 単独のコマンド、またはコマンドの並びにある最初のコマンドは、 global コマンドと同じ行にきます。 複数行リストの最後の行以外のすべての行は、 \ で終わっていなければなりません。 a、i、c コマンドとそれらに関連した入力が許されます。 入力モードを終了させる . は、それがコマンドの最後の行にくる場合には、省略することができます。 コマンド g と v をコマンドに指定することはできません。
(.)i
text
.
insert コマンドは、与えられたテキストをアドレス指定された行の前に挿入します。 . は、入力された最後の行、または入力された行がなければ、 アドレス指定された行の前の行にセットされます。 このコマンドと a コマンドとでは、 テキストが置かれる位置だけが違います。
(.,.+1)j
join コマンドは、アドレス指定された行を結合して単一の行にします。 途中にある改行を単に取り除くだけです。 . は、結果として得られた行に置かれます。
(.)kx
mark コマンドは、アドレス指定された行を名前 x を用いてマークします。 x は、1つの小文字でなければなりません。 ’x という形式のアドレスは、この行を指します。
(.,.)l
list コマンドは、アドレス指定された行のすべてのキャラクタを 適切に表示します。 印字可能でないキャラクタの場合は、2 桁、または 3 桁の 8 進数で表示され、 長い行は改行されます。 l コマンドは入出力を伴わないコマンドのあとにおくことができます。
(.,.)ma
move コマンドは、アドレス指定された 1 つまたは複数の行を、 a で指定された行のあとに移動します。 移動された行の最後の行が現在行になります。
(.,.)p
print コマンドは、アドレス指定された行を表示します。 . は表示された最後の行にセットされます。 p コマンドは入出力を伴わないコマンドのあとにおくことができます。
(.,.)P
このコマンドは、 p コマンドと同じです。
q quit コマンドは、 ed を終了させます。ファイルの自動書込みは行われません。
Q このコマンドは、 バッファの最後の変更以降に w が実行されていないと診断がないという点を除き、 q コマンドと同じです。
($)r filename
read コマンドは、アドレス指定された行のあとに、 指定されたファイルを読み込みます。 ファイル名が指定されない場合には、 記憶されているファイル名があれば、 それが使用されます (e および f コマンド参照)。 既に記憶されているファイル名がない場合には、 ここで指定したファイル名が記憶されます。 r では、アドレス 0 が認められていて、 これを使用すると、ファイルがバッファの先頭に読み込まれます。 読取りが成功すると、 読み取られたキャラクタの数が表示されます。 . はファイルから読み取られた最後の行にセットされます。
( .,.)s/regular expression/replacement/ または
( .,.)s/regular expression/replacement/g
substitute コマンドは、アドレス指定された各行について指定された regular expression (正規表現)と一致するものを探すためにサーチを行います。 グローバル置換指示子 g がコマンドのあとにある場合には、一致するものが 見つけられた各行において、すべての一致した文字列が replacement (置換文字列)に置き換えられます。グローバル置換指示子がない場合には、 各行で最初に一致した文字列だけが置き換えられます。アドレス指定された すべての行で置き換えができない場合にはエラーになります。任意の 区切りキャラクタを / の代わりに使用して、正規表現と置換文字列とを 区切ることができます。 . は、置き換えの行われた最後の行に置かれます。
置換文字列内にあるアンパサンド & は、正規表現と一致する文字列に 置き換えられます。この分脈における & の特別な意味は、 \ を 前に付けることによって抑制することができます。 キャラクタ \n (ここで n は数字)は、 \( と \) で囲まれた n 番目の部分表現と一致した テキストによって置き換えられます。ネストになっている、 かっこで囲まれた部分表現があるときには、 n は左から \( を数えることによって決定されます。
行は、改行キャラクタを置換挿入することによって分割することができます。 置換文字列内の改行は、前に \ を付けてエスケープしなければなりません。
(.,.)ta
このコマンドは、アドレス指定された行のコピーがアドレス a (0 でもよい)の 後に置かれる点を除けば、 m コマンドと同じ働きをします。 . はコピーの最後の行に置かれます。
(.,.)u
undo コマンドは、最新のバッファ修正コマンドが実行される前の状態に バッファを復元します。現在行も復元されます。バッファ修正コマンドには、 a、c、d、 g、i、k、 v があります。 undo の目的のために、 g と v は単一のバッファ修正コマンドと見なされます。
ed のメモリが不足したときには、取り消すことは不可能になり、 u は現在行での最新の置換の結果を取り消せるだけです。 この限定された取り消しは、 ed が − オプションを使用して呼び出された場合には、 エディタスクリプトにも適用されます。
(1,$)v/regular expression/command list
このコマンドは、正規表現に一致する行以外のすべての行ごとに、当初 . をセットしてコマンドの並びが実行される点を除けば、 global コマンド g と同じです。
(1,$)w filename
write コマンドは、アドレス指定された行を指定されたファイルに書き込みます。 ファイルが存在しない場合には、作成されます。 既に記憶されているファイル名がない場合には、 このファイル名が記憶されます。 ファイル名が指定されない場合には、記憶されているファイル名があれば、 それが使用されます (e および f コマンド参照)。 . は変更されません。 コマンドが成功した場合には、書き込まれたキャラクタの数が表示されます。
(1,$)W filename
このコマンドは、アドレス指定された行がファイルに追加される点を除けば、 w と同じです。
(1,$)wq filename
このコマンドは、あとで q コマンドが実行される、つまり、 ファイルが書き込まれてからエディタが終了する点を除けば、 w コマンドと同じです。
($)= アドレス指定された行の行番号が表示されます。 . は、このコマンドによって変更されません。
!<shell command>
! のあとの行の残りの部分が sh(1) へ送られてコマンドとして解釈されます。 . は変更されません。
(.+1,.+1)<newline>
アドレスだけだと、アドレス指定された行を表示します。 単独のブランク行は、 .+1p に相当します。 これは、テキストを 1 行ずつ見ていく場合に役立ちます。 間にセミコロンがない 2 つのアドレスがある場合には、 ed はその範囲の行を表示します。 2 つのアドレスがセミコロンで区切られている場合には、 その第 2 の行が表示されます。
割込みシグナル (通常は ^C) が送られると、 ed は ?interrupted を表示し、コマンドレベルに戻ります。
サイズ制限:
1 行は 512 キャラクタ、global コマンドの並びは 256 キャラクタ、 ファイル名は 64 キャラクタです。
ファイルを読み取るときに、 ed は ASCII の NUL キャラクタと、 最後の改行のあとにあるすべてのキャラクタを破棄します。
多国語対応
漢字をはじめ多国語の入力に対応するための処理は、以下のとおりです。
tty モードを sjis、euc、jis または tca (台湾コード) モードに設定することで、 ASCII 文字と同様に漢字を入力することができます。
関連ファイル
/tmp/e∗ エディタの一時的ファイル
ed.hup 端末装置がハングアップした場合には、作業中のデータはここに保存されます。
関連事項
B. W. Kernighan, A Tutorial Introduction to the ED Text Editor
B. W. Kernighan, Advanced editing on UNIX
ex(1), sed(1), crypt(1)
診断
アクセス不能ファイルには、 ?<名前>
その他のエラーの場合は、 ?
貴重な作業が消えてしまうのを防止するために、 最後のバッファの変更以降に w コマンドが実行されていない場合には、 q または e コマンドはエラーであると見なされます。 再度、 q または e コマンドを入力すると、有効になります。
バグ
undo コマンドは、対象となる行に付いていたマークを失くしてしまいます。
NEWS-OSRelease 4.2.1R