ED(1)

名称
ed - 行指向のテキストエディタ

書式
ed [-] [-sx] [-p string] [file]

解説
ed は、行指向のテキストエディタです。 本コマンドを用いることで、テキストファイルの生成、表示、変更その他の操作を 行うことが出来ます。 file 引数を指定して本コマンドを起動すると、 file で指定したファイルをエディタのバッファにコピーします。 以後の変更はそのコピーに対して行われ、 file で指定したファイルの実体に対して直接の変更はかかりません。 ed の終了の際に、 `w' コマンドで明示的に保存しなかった変更点はすべて失われます。 編集は、 コマンド モードと 入力 モードの 2 つの異なるモードを使い分けて行います。 ed を起動したら、まずコマンドモードに入ります。 本モードでは、標準入力からコマンドを読み込み、それを実行することで エディタバッファの内容操作を行います。 典型的なコマンドは、以下のようなものです。

    ,s/old/new/g

これは、編集しているテキストファイル中に old という文字列があったら、これらをすべて文字列 new に置き換えるコマンドです。 コマンドモードにて、 `a' (append)、 `i' (insert)、そして `c' (change)のいずれかのコマンドが入力された場合、 ed は入力モードに移行します。このモードの主要な機能は、ファイルに テキストを追加することです。 このモードでは、コマンドモードで実行可能なコマンドを実行することは出来ません。 そのかわり、標準入力から入力されたデータは、 直接エディタバッファへと書き込まれます。行は、改行キャラクタまで のテキストデータおよび、最後の 改行 キャラクタを含むデータから構成されます。 ピリオド 1 つだけの行を入力した場合、入力モードは終了し、 コマンドモードに移行します。 すべての ed コマンドは、全ての行もしくは指定した範囲の行の操作が可能です。例えば、 `d' コマンドは指定した行を削除し、 `m' コマンドは指定した行を移動します。 上に示した例のように、置換コマンドを使うことで、ある行の一部分のみを 変更することは可能ですが、どこにいようとも、 `s' コマンドは一度に全部の行にわたって変更を行うことが可能です。 一般的には、 ed コマンドは、0 個以上の行番号および、それに連なる 1 文字コマンドから 成り立ちます。 場合によっては、追加のパラメータを持つこともあります。 いうなれば、コマンドは以下の構造を持ちます:

    [address [,address]]command[parameters]

行番号を 1 つだけ指定した場合は、指定した番号の行そのものを指し、カンマ で 2 つの行番号を続けて指定した場合には、その行番号にはさまれた (行番号 自身の指し示す行も含まれます) 行全体を指します。そして、それらの行に 含まれるテキストが、コマンドによる編集対象となります。 行番号の指定回数が、コマンドが受け付け可能な回数よりも少ない場合には、 デフォルトの行番号が採用されます。

  オプション

-s  診断メッセージを抑制します。本オプションは、 ed の入力がスクリプトによって行われる場合に有効です。

-x  続いて起こる読み書きで利用されるる暗号化の鍵の入力を促します ( `x' コマンドを参照して下さい)。

-p string
    コマンドプロンプトとして表示する文字列を指定します。コマンドプロンプトは、 コマンドモードで `P' コマンドを実行することで、表示する/しないを切り替えることが可能です。

file
    編集対象のファイルを指定します。 file 名の先頭に感嘆符 (!) が付加されていた場合、そのファイル名はシェルコマンドと して解釈されます。この場合、編集対象のテキストは、 file で指定したコマンドを実行した結果、標準出力に出力されるデータです。 先頭が感嘆符で始まるファイルを編集する場合には、ファイル名の先頭に バックスラッシュ (\) を付加して下さい。 感嘆符以外の文字で始まるファイル名については、編集対象のファイル名は file となります。

  行指定
行は、バッファ内の行番号で表現されます。 行番号が指定されない場合には、通常 ed は 現在行 をコマンドのデフォルト行として編集を行います。 ファイルが最初に読み出された直後は、現在行はファイルの最後の行となります。 一般的に、現在行は、コマンドによって指定された最後の行となります。 行番号は、以下の一覧のうち 1 つおよび、補助的に付加される相対行番号から 構成されます。相対行番号は、任意の数字の組合せと演算子 (例えば + や - や ^ )、そして空白文字を含みます。 行番号は、左から右に解釈され、それらの演算子を含む値は、現在行からの 相対行番号と解釈されます。 行番号の表現に関して上記の規則が適用される中で、行番号 0 (ゼロ) に関しては、例外的な扱いがされます。 これは、"最初の行より前" を指し示します。それ以外は、特にコマンドに注釈が ない限りは、他の行番号と同様の扱いになります。 行範囲は、カンマ、もしくはセミコロンで区切られた 2 つのアドレスで示されます。 最初に指定される行番号は、次に指定される行番号を超える値を指定して はいけません。行範囲指定で行番号が 1 つしか指定されなかった場合には、次に 指定されるアドレスと最初に指定されたアドレスが同じものであるとみなされ ます。ここで 2 つを超える数の行番号が指定されると、最後の 2 つの行番号で 決定される範囲がコマンド実行対象になります。行番号の指定を 1 つだけしか 規定していないコマンドの場合、最後の 1 つの行番号の行がコマンド実行対象 となります。 カンマで区切られた各行番号は、現在の行からの相対行を指し示します。 セミコロンで区切られている場合は、範囲の始めの行は現在行が設定され、範囲の 終りは始めの行からの相対行で表されます。 行番号の指定には、以下のシンボルが使用可能です。

.   バッファ中の現在行を表します。

$   バッファ中の最終行を表します。

n   バッファ内の n 行目を表します。 n は、 [0,$]. の間です。

- or ^
    1 行前の行です。 相対行指定 -1 と同等であり、複数指定することで効果を累積することが可能です。 --- という指定をすることで、2 行前を示すことができます。

-n or ^n
    n 行前の行を表します。 n は、正の整数です。

+   次の行を表します。 これは、 +1 と同等であり、- と同様の累積的指定が可能です。

+n or whitespacen
    n 行後ろの行を表します。 n は、正の整数です。 n の前に whitespace (空白文字) を付加して指定した場合も +n と解釈されます。 ただし、空白文字による指定を行った場合は、単独では現在行からの相対行数を 指定することはできず、相対行指定の基準となる行をその前に指定しなければ なりません。

, or %
    バッファの最初から最後までを表します。これは、 1,$. と指定した場合と同等です。

;   バッファ中の現在行から最後の行までを表します。これは、 .,$. と指定した場合と同等です。

/re/
    指定された正規表現 re を含む、現在行よりも後ろの行を表します。 必要であれば、文字列検索は、テキスト先頭に折り返し、現在行まで検索を行います。 // は、最後に行った検索を繰り返します。

?re?
    指定した正規表現 re を含む、現在行より前の行を表します。必要であれば、文字列検索は、 テキストの最後に折り返し、現在行まで検索を行います。 ?? は、最後に行った検索を繰り返します。

'lc `k' (mark) コマンドでマークをつけた行を表します。 lc は、英小文字です。

  正規表現
正規表現については、英語版のマニュアルを参照して下さい。

  コマンド
全ての ed コマンドは、1 文字からなりますが、追加パラメータが必要なコマンドもあります。 コマンドのパラメータが複数の行にわたる場合には、そのパラメータを含めたコマンド の終りを含む行を除き、行末にバックスラッシュ (\) を付加して下さい。 一般的には、1 行ごとに 1 コマンドを入れることが許されています。 しかしながら、ほとんどのコマンドは、コマンド実行を行った後のデータ更新 その他を確認するために、 `p' (print)、 や `l' (list)、 `n' (enumerate), のような表示系のコマンドを同時に指定できます。 インタラプト (一般的には ^C) を入力することで、現在実行しているコマンドを アボートし、コマンドモードに戻すことが出来ます。 ed は、以下のコマンドを使用できます。もし、コマンド実行時に何の指定もない場合の デフォルトの行番号もしくは行範囲が括弧内に示されています。

(.)a
    指定した行の後にテキストを追加します。 本コマンド実行後は、入力モードに入ります。 現在行番号は、入力された最後の行に設定されます。

(.,.)c
    バッファ内の指定した行を変更します。指定した行のデータは、バッファから消去 され、そこに対してテキストデータを入力するようになります。なお、本コマンド を実行したら入力モードに移行します。 現在行番号は、入力した最後の行に設定されます。

(.,.)d
    指定した範囲をバッファから削除します。 削除した範囲の後に行が続いている場合、現在行番号は、その行に設定されます。 そうでない場合には、現在行番号は、削除された範囲の前の行に設定されます。

e file
    file を編集し、デフォルトのファイル名を設定します。 もし file が指定されなかった場合には、デフォルトのファイル名が使用されます。 本コマンド実行時に、それまで別のファイルを編集していた場合には、 その内容はすべて消去され、新しいファイルが読み込まれます。 現在行番号は、入力された最後の行に設定されます。

e !command
    command で指定されたコマンドを実行し、その結果として標準出力へ 出力されたデータを編集します。 (後述する !command を参照して下さい) デフォルトのファイル名は変更されません。 本コマンド実行時に、それまで別のファイルを編集していた場合には、 その内容はすべて消去され、標準出力へ出力されたデータが読み込まれます。 現在行番号は、入力された最後の行に設定されます。

E file
    無条件で file で指定したファイルを読み込み、編集します。 e コマンドと動作は似ていますが、すでにバッファ上のデータに変更が加えられ ている場合に E コマンドを実行した場合に警告を出さずに指定した ファイルを読み込む点が異なります。 現在行番号は、入力された最後の行に設定されます。

f file
    デフォルトファイル名を file に設定します。 file 名が指定されない場合には、デフォルトファイル名が表示されます。

(1,$)g/re/command-list
    command-list で指定されたコマンドを、指定した正規表現 re に一致する行に対して実行します。 現在行番号は、 command-list で指定されたコマンドが実行される前に、指定した正規表現に一致した行 に設定されます。 `g' コマンドが終了した場合、現在行番号は最後にコマンドが実行された行に 設定されます。 command-list で指定されるコマンドは、1 行ごとに 1 つずつ書かれる必要があります。 各コマンドラインの終りには、一番最後のコマンドラインを除いてはバックスラッシュ (\) を 記述する必要があります。コマンド `g', `G', `v', `V' を除く全てのコマンドが指定可能です。コマンドリスト中の空行は、 `p' コマンドと同等に扱われます。

(1,$)G/re/
    指定した正規表現 re に一致した行に対して、対話編集を行います。 指定した正規表現に一致する文字列を含む行があると、その行を表示し、現在行番号を 設定します。 そして、ユーザに command-list の入力を促します。 `G' コマンドが終了した場合、現在行番号は、 command-list で編集された最後の行に設定されます。 command-list の記述形式は、 `g' コマンドで指定するものと同じです。改行のみの場合は、コマンド実行をしない (ヌルコマンドリストを指定した) ものとみなされ、次に条件に一致する文字列を 検索します。`&'文字のみを入力した場合には、 直前に実行した (ヌルコマンドリストではない) コマンドを再実行します。

H   エラーメッセージの出力の有無を切り替えます。 デフォルトでは、エラーメッセージは出力されません。 edスクリプトを作成する場合、スクリプトのデバッグのために、本コマンドを 最初に実行することをおすすめします。

h   最後に表示されたエラーメッセージを表示します。

(.)i
    編集バッファ中の現在行の前に、テキストを挿入します。 本コマンド実行後、入力モードに移行します。 現在行番号は、入力された最後の行に設定されます。

(.,.+1)j
    指定した範囲の行を 1 行に連結します。指定した行はバッファから削除され、 その行の内容を含む 1 行に置き換えられます。 現在行番号は、置き換えられた行に設定されます。

(.)klc
    行に、英小文字 lc で指定したマークをつけます。 その後、マークを付けられた行は、コマンド中で 'lc として指定できるようになります。 マークは、その行が削除されるかもしくは変更されるかしない限り、消えることは ありません。

(.,.)l
    指定した範囲の行の内容を見やすく表示します。 もし 1 つの行が 1 画面以上を占める場合 (例えばバイナリファイルを見ている 場合など) `--More--' プロンプトが最下行に表示されます。 次の画面を表示する前に ed はリターンキーが入力されるまで待ちます。 現在行番号は、表示された最後の行に設定されます。

(.,.)m(.)
    指定した範囲の行をバッファ内で移動します。指定した行は、 コマンドの右側で指定した行の後ろに移動されます。移動先の行としては、 0 (ゼロ) が指定可能です。 現在行番号は、移動された最後に設定されます。

(.,.)n
    指定した行の内容を、行番号つきで表示します。 現在行番号は、表示された最後の行に設定されます。

(.,.)p
    指定した範囲の行の内容を表示します。 現在行番号は、表示された最後の行に設定されます。

P   コマンドプロンプトの表示の有無を切り替えます。 コマンド起動時のオプション-p stringでプロンプトが指定されない限り、 コマンドプロンプトの表示はデフォルトでオフになっています。

q   edを終了します。

Q   無条件に ed を終了します。 q コマンドと似ていますが、まだファイルに書き出されて いない変更があってもワーニングを出さずに終了する点が異なります。

($)r file
    Reads file で指定されたファイルを、指定した行の後ろに読み込みます。 file が指定されない場合、デフォルトのファイル名が読み込みに使用されます。 このコマンドに先だってデフォルトのファイル名が設定されていない場合、 デフォルトのファイル名には、 file で指定されたものが設定されます。 それ以外の場合、デフォルトのファイル名は変更されません。 現在行番号は、読み込まれたファイルの最後の行に設定されます。

($)r !command
    command で指定されたコマンドを実行し、その結果として標準出力へ出力された データを指定した行の後ろに読み込みます。 (後述する !command を参照して下さい) デフォルトのファイル名は変更されません。現在行番号は、読み込まれた最後の行の 行番号に設定されます。

(.,.)s/re/replacement/
(.,.)s/re/replacement/g
(.,.)s/re/replacement/n
指定した行のテキスト中の、正規表現 re に一致する文字列を、文字列 replacement に置き換えます。 デフォルトでは、一番最初に一致した行の文字列のみが置き換えられます。 `g' (global) サフィックスが指定された場合、一致した文字列はすべて置き換えられます。 `n' サフィックスは、 n 回目に一致した文字列を置き換えます。 ここで n は正の整数です。 指定した範囲で 1 度も文字列の置換が起こらなかった場合、エラーとみなされます。 現在行番号は、最後に文字列置換が発生した行に設定されます。 re および replacement は、スペースおよび改行を除くすべてのキャラクタを用いて区切ることが 可能です (後述の `s' コマンドを参照して下さい)。 最後のデリミタのうち 1 つか 2 つが省略された場合、 最後に文字列置換が発生した行は、 `p' コマンドが指定された場合と同様に表示されます。 replacement 中のエスケープされない `&' は、一致した文字列と置き換えられます。 キャラクタシーケンス `\m'( m は、[1,9] の範囲に入る整数です)は、一致した文字列の m 番目の後方参照で置き換えられます。 もし replacement の中に入る文字が`%'のみだった場合、最後に行った置換の replacement が使用されます。 改行を replacement に指定したい場合は、バックスラッシュを用いてエスケープすれば可能です。
(.,.)s
    最後の置換を繰り返します。 この形式の `s' コマンドは、回数を示すサフィックス `n' もしくは、他の `r'、 `g'、 そして `p' のどのキャラクタとの組合せも可能です。 `n' が指定されると、 n 回目に一致した文字列だけが置換されます。 `r' サフィックスが指定されると、最後の置換が発生した文字列の変わりに、 最後に指定した正規表現が使用されます。 `g' サフィックスは、最後の置換のグローバルサフィックスの 有効、無効を切り替えます。 `p' サフィックスは、最後の置換に指定されたプリントサフィックスを反転します。 現在行番号は、最後に置換が発生した行に設定されます。
(.,.)t(.)
    指定した範囲の行を、コマンド文字の右側に指定した行番号の後にコピーします。 コピー先の行番号としては、 0 (ゼロ) の指定が許されています。 現在行番号は、コピーした一番最後の行の行番号に設定されます。
u   最後に実行したコマンドの実行結果を取り消し、現在行番号を、取り消したい コマンドが実行される前のものに戻します。 グローバルコマンドである `g'、 `G'、 `v'、 そして `V'. については、その改変は 1 コマンドで行われたとして扱います。 `u' は自分自身の動作を取り消すことも出来ます。
(1,$)v/re/command-list
    指定した範囲の行のうち、指定した正規表現 re と一致する文字列が含まれていない行について、 command-list で指定したコマンドを実行します。 これは `g' コマンドに動作が似ています。
(1,$)V/re/
    指定した範囲の行のうち、指定した正規表現 re に一致する文字列が含まれていない行について、対話編集を行います。 これは `G' コマンドに動作が似ています。
(1,$)w file
    指定した範囲の行を、 file で指定したファイルに書き出します。 それまで file に格納されていた内容は、警告なしに消去されます。 デフォルトファイル名が設定されていない場合、デフォルトファイル名は file に設定されます。それ以外の場合では、デフォルトファイル名は変更されません。 ファイル名が指定されなかった場合には、デフォルトファイル名が使用されます。 現在行番号は変更されません。
(1,$)wq file
    指定した範囲の行を file で指定したファイルに書きだし、 `q' コマンドを実行します。
(1,$)w !command
    指定した範囲の行の内容を `!command' の標準入力に書き出します。(! command については、以下の説明を参照して下さい) デフォルトファイル名および現在行番号は変更されません。
(1,$)W file
    指定した範囲の行の内容を、 file で指定したファイルの後ろに追加書き込みします。 `w' コマンドと似ていますが、指定したファイルにそれまで格納されていた内容が なくなることはありません。 現在行番号は変更されません。
x   暗号化鍵の入力を促します。詳細は英語版マニュアルを参照して下さい。
(.+1)zn
    指定した行から一度に n 行だけスクロールします。 n が指定されない場合には、現在のウィンドウサイズだけスクロールします。 現在行番号は、最後に出力した行の行番号に設定されます。
!command
    command で指定したコマンドを、 sh(1) 経由で実行します。 command の最初の文字が `!' の場合には、その文字は直前に `!command' で実行したコマンド文字列が格納されます。 ed command 文字列をバックスラッシュ (\) でエスケープした場合には、 ed は処理を行いません。 しかし、エスケープされない `%' 文字があった場合には、その文字列はデフォルトファイル名に置き換えられます。 シェルがコマンド実行から戻ってきた場合には、`!' が標準出力に出力されます。 現在行番号は変更されません。
($)=
    現在行番号を表示します。
(.+1)newline
    指定した行を表示します。そして、現在行番号を表示した行のものに設定します。

関連ファイル
/tmp/ed.*
    バッファファイル
ed.hup
    端末が回線切断された場合に、 ed がバッファ内容を書き出すファイル

関連項目
vi(1), sed(1), regex(3), bdes(1), sh(1). USD:12-13 B. W. Kernighan and P. J. Plauger, Software Tools in Pascal , Addison-Wesley, 1981.

制限
英語版マニュアルを参照して下さい。

診断
エラーが発生すると、 ed は`?'を表示し、コマンドモードに戻るか、スクリプトによる実行のエラーの場合には プログラムを終了します。 最後のエラーメッセージについての説明は、 `h' (help) コマンドを用いることで表示可能です。 `g' (global) コマンドは、検索や置換が失敗したというエラーを隠蔽します。 そのため、スクリプトの中で条件つきコマンド実行を行わせるのによく使われます。 例えば

    g/old/s//new/

は、出現した文字列 old をすべて文字列 new に置き換えます。 `u' (undo) コマンドがグローバルコマンドリスト内で実行された場合、コマンドリストは 1 度だけの実行になります。 診断が無効にされていないと、 ed を終了しようとする場合やバッファ内のデータを書き出さずに他のファイルを 編集しようとした場合にエラーになります。 その場合でも、同一のコマンドを 2 回入力すると、コマンドは成功します。 しかし、それまでの未保存の編集結果は、すべて失われます。