ED(1) — UNIX 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 が ASCIIコードの昇順になっている部分文字列 a−b は、 ASCIIキャラクタの両端を含む範囲を意味します。
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 モードに設定することで、 ASCII文字と同様に漢字を入力することができます。
関連ファイル
/tmp/e∗
edhup:端末装置がハングアップした場合には、作業中のデータはここに保存されます。
関連事項
B. W. Kernighan, A Tutorial Introduction to the ED
B. W. Kernighan, Advanced editing on UNIX
ex(1), sed(1), crypt(1)
診断
アクセス不能ファイルには、‘?<名前>’ その他のエラーの場合は、‘?<自明のメッセージ>’
貴重な作業が消えてしまうのを防止するために、 最後のバッファの変更以降に w コマンドが実行されていない場合には、 q または e コマンドはエラーであると見なされます。 再度、q または e コマンドを入力すると、有効になります。
バグ
undo コマンドは、対象となる行に付いていたマークを失くしてしまいます。
NEWS-OSRelease 3.3