スポンサーリンク

ED(1) FreeBSD 一般コマンドマニュアル ED(1)

名称

ed, red − 行指向のテキストエディタ

書式

ed [] [−sx] [−p string] [file]

red [] [−sx] [−p string] [file]

解説

ed ユーティリティは、行指向のテキストエディタです。本コマンドを用いること で、テキストファイルの生成、表示、変更その他の操作を行なうことができま す。 red として起動された場合、エディタは "制限" モードで動作します。唯一 の違いは、 ‘!’ (ed がシェルコマンドと解釈) で開始または ‘/’ を含むファイ ル名の使用を制限することです。カレントディレクトリ外の編集を妨げるのは、 ユーザがカレントディレクトリに対して書き込み権限が無い場合だけです。ユー ザがカレントディレクトリに対して書き込み権限がある場合、カレントディレク トリにシンボリックリンクを作成可能であり、シンボリックリンクが指すファイ ルをユーザが編集することを red は妨げません。

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]
行番号はコマンドの操作対象行あるいは対象行範囲を示します。行番号の指定個数が、コマンドが受け付け可能な個数よりも少ない場合には、デフォルトの行番号が採用されます。

オプション

以下のオプションが使用できます。

       −s

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

−x
続く読み書きの際に行なわれる暗号化に用いる鍵の入力を促します (x コマンドを参照して下さい)。

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

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

行指定

行は、バッファ内の行番号で表現されます。 ed ユーティリティは 現在行を管理 しており、コマンドに行番号が指定されない場合は、現在行がデフォルト行とし て用いられます。ファイルが最初に読み出された直後は、現在行はファイルの最 後の行となります。一般的に、現在行はコマンドが操作した最後の行となりま す。

行番号は、以下の一覧のうち 1 つおよび、補助的に付加される相対行番号 (オフ セット) から構成されます。相対行番号は、任意の数字の組み合わせと演算子、 そして空白文字を含みます (例えば +, -^ が演算子に含まれます)。行番号 は、左から右に解釈され、それらの演算子を含む値は、現在行からの相対行番号 と解釈されます。

行番号の表現に関して上記の規則が適用される中で、行番号 0 (ゼロ) に関して は、例外的な扱いがされます。これは「最初の行より前」を意味し、それが正し い意味を持つ場合は常に利用可能です。

行範囲は、コンマもしくはセミコロンで区切られた 2 つのアドレスで示されま す。最初に指定される行番号は、2 番目に指定される行番号を超える値を指定し てはいけません。行範囲指定で行番号が 1 つしか指定されなかった場合には、2 番目に指定されるアドレスとして最初に指定されたアドレスが設定されます。こ こで 3 個以上の行番号が指定されると、最後の 2 つの行番号で決定される範囲 がコマンド実行対象になります。行番号の指定を 1 つだけしか想定していないコ マンドの場合、最後の 1 つの行番号の行がコマンド実行対象となります。

コンマで区切られた各行番号は、現在行からの相対行を指し示します。セミコロ ンで区切られている場合は、範囲の始めの行は現在行が設定され、範囲の終りは 始めの行からの相対行で表わされます。

行番号の指定には、以下のシンボルが使用可能です。

       .

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

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

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

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

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

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

+n
n
行後ろの行を表します。 n は、負でない整数です。

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

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

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

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

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

正規表現

正規表現はテキストを選択する際に用いるパターンです。例えば次の ed コマン ド

g/string

               /
は string を含む全ての行を表示します。正規表現は s コマンドで古いテキストを新しいテキストで置き換える際にも用いられます。
文字リテラルを指定するのに加え、正規表現は文字列のクラスを表現することができます。このようにして表現された文字列は、それに対応する正規表現に「マッチする」と言います。ある正規表現が一つの行の中の複数の文字列にマッチする場合、マッチする部分のうち最も左にあって最も長いものが選択されます。
正規表現を組み立てる際には以下のシンボルが用いられます:
       c             以下に挙げるものを除く任意の文字 c は、その文字自身にマッチします。このような文字には ‘{’, ‘}’, ‘(’, ‘)’, ‘<’, ‘>’ が含まれます。
       \c             バックスラッシュでエスケープした文字 c は、その文字自身にマッチします。ただし ‘{’, ‘}’, ‘(’, ‘)’, ‘<’, ‘>’ を除きます。
       .             任意の一文字にマッチします。
       [char-class]             文字クラス char-class に含まれる任意の一文字にマッチします。文字クラス char-class に ‘]’ を含めるには、文字 ‘]’ を最初の文字に指定します。文字の範囲を指定するには、範囲の両端の文字の間を ‘-’ でつなぎます。例えば ‘a-z’ は小文字全体を表します。以下のようなリテラル表記も、文字集合を指定するために文字クラス char-class で使用することができます:

[:alnum:] [:cntrl:] [:lower:] [:space:]

[:alpha:] [:digit:] [:print:] [:upper:]

[:blank:] [:graph:] [:punct:] [:xdigit:]

文字クラス char-class の最初あるいは最後の文字として ‘-’ が用いら れると、それはその文字自身にマッチします。文字クラス char-class 中のこれ以外の文字は全て、それら自身にマッチします。

以下の形式の文字クラス中のパターン:

[.col-elm.] or,
[=col-elm=]

は現在のロケールに沿って解釈されます (現在のところサポートされま せん)。ここで col-elmcollating element です。詳しい説明は regex(3)re_format(7) を参照して下さい。

       [^char-class]

文字クラス char-class に含まれない、改行以外の任意の一文字にマッ チします。文字クラス char-class は上で定義しています。

^
^
が正規表現の最初の文字である場合、その正規表現は行頭でのみマッ チします。それ以外の場合、 ^ はそれ自身にマッチします。

$
$
が正規表現の最後の文字である場合、その正規表現は行末でのみマッ チします。それ以外の場合、 $ はそれ自身にマッチします。

\<
これに続く単一文字の正規表現あるいはその部分式が、単語の先頭での みマッチするようにします (この機能は利用できない場合があります)。

\>
これに続く単一文字の正規表現あるいはその部分式が、単語の末尾での みマッチするようにします (この機能は利用できない場合があります)。

\(re\)
部分式 (subexpression) re を定義します。部分式はネストできます。 これ以降、 \n ( n は [1,9] の範囲の数) の形式の後方参照は、 n 番 目の部分式にマッチしたテキストに展開されます。例えば、正規表現 ‘\(.*\)\1’ は、同じ文字列が隣接しているような任意の文字列にマッチ します。部分式は左側のデリミタから順に番号が振られます。

*
直前にある単一文字の正規表現あるいはその部分式の 0 回以上の繰り返 しにマッチします。 * が正規表現あるいはその部分式の最初の文字とし て用いられた場合、 * はその文字自身にマッチします。 * 演算子は時 に予期しない結果をもたらすことがあります。例えば、正規表現 ‘b*’ は文字列 ‘abbb’ の先頭にマッチします (部分文字列 ‘bbb’ ではありま せん)。これはヌルへのマッチが最も左にあるマッチだからです。

\{n,m\} or \{n,\} or \{n\}
直前にある単一文字の正規表現あるいはその部分式の、 n 回以上 m 回 以下の繰り返しにマッチします。 m が省略された場合、 n 回以上の繰 り返しにマッチします。更にコンマも省略された場合、ちょうど n 回の 繰り返しにのみマッチします。

regex(3) の実装によっては、更に正規表現演算子がいくつか定義されている ことがあります。

コマンド

全ての ed コマンドは、1 文字からなりますが、追加パラメータが必要なコマン ドもあります。コマンドのパラメータが複数の行にわたる場合には、そのパラ メータを含めたコマンドの終りを含む行を除き、行末にバックスラッシュ (\) を 付加して下さい。

一般的には、1 行ごとに 1 コマンドを入れることが許されています。しかしなが ら、ほとんどのコマンドは、コマンド実行を行なった後のデータ更新その他を確 認するために、 p (print)、や l (list)、 n (enumerate), のような表示系のコ マンドを同時に指定できます。

インタラプト (一般的には ^C) を入力することで、現在実行しているコマンドを 強制終了し、コマンドモードに戻すことができます。

ed ユーティリティは、以下のコマンドを使用できます。コマンド実行時に何の指 定もない場合のデフォルトの行番号もしくは行範囲が括弧内に示されています。

       (.)a

指定した行の後にテキストを追加します。テキストは入力モードで入力 されていきます。現在行番号は、入力された最後の行に設定されます。

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

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

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

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

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

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

(1,$)g/re/command-list
command-list
で指定されたコマンドを、指定した正規表現 re に一致す る各行に対して実行します。現在行番号は、 command-list で指定され たコマンドが実行される前に、指定した正規表現に一致した行に設定さ れます。 g コマンドが終了した場合、現在行番号は最後に command-list 実行の影響を受けた行に設定されます。

command-list で指定されるコマンドは、1 行ごとに 1 つずつ書かれる 必要があります。各コマンド行の終りには、一番最後のコマンド行を除 いてはバックスラッシュ (\) を記述する必要があります。コマンド g, G, v, V を除くすべてのコマンドを指定可能です。 command-list 中の 空行は、 p コマンドと同等に扱われます。

(1,$)G/re/
指定した正規表現 re に一致した行に対して、対話編集を行ないます。 指定した正規表現に一致する文字列を含む行があると、その行を表示 し、現在行番号を設定します。そして、ユーザに command-list の入力 を促します。 G コマンドが終了した場合、現在行番号は、 command-list 実行の影響を受けた最後の行に設定されます。

command-list の記述形式は、 g コマンドで指定するものと同じです。 改行のみの場合は、コマンド実行をしない (ヌルコマンドリストを指定 した) ものとみなされます。 ‘&’ 文字のみを入力した場合には、直前に 実行した (ヌルコマンドリストではない) コマンドを再実行します。

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

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

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

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

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

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

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

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

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

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

q
ed
を終了します。

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

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

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

(.,.)s/re/replacement/

(.,.)s/re/replacement/g

(.,.)s/re/replacement/n
指定した行のテキスト中の、正規表現 re に一致する文字列を、文字列 replacement に置き換えます。デフォルトでは、それぞれの行で最初に 一致した文字列のみを置き換えます。 g (global) サフィックスが指定 された場合、一致した文字列はすべて置き換えられます。 n サフィック ス (n は正の整数) が指定された場合、 n 回目に一致した文字列だけを 置き換えます。指定した範囲で一度も文字列の置換が起こらなかった場 合、エラーとみなされます。現在行番号は、最後に置換が発生した行に 設定されます。

re および replacement は、スペースおよび改行を除くすべてのキャラ クタを用いて区切ることが可能です (後述する s コマンドを見て下さ い)。最後のデリミタのうち 1 つか 2 つが省略された場合、最後に文字 列置換が発生した行は、 p コマンドが指定された場合と同様に表示され ます。

replacement 中のエスケープされていない ‘&’ は、一致した文字列と置 き換えられます。キャラクタシーケンス \m (m は [1,9] の範囲の整数 です ) は、一致した文字列の m 番目の後方参照で置き換えられます。 replacement の中に入る文字が ‘%’ のみだった場合、最後に行なった置 換の replacement が使用されます。改行を replacement に指定したい 場合は、バックスラッシュを用いてエスケープすれば可能です。

(.,.)s
最後の置換を繰り返します。この形式の s コマンドは、回数を示すサ フィックス n もしくは、他の rgp のどのキャラクタとの組み合 わせも可能です。 n が指定されると、 n 回目に一致した文字列だけが 置換されます。 r サフィックスが指定されると、最後の置換が発生した 文字列の変わりに、最後に指定した正規表現が使用されます。 g サ フィックスは、最後の置換で用いたグローバルサフィックスの使用の有 効/無効を切り替えます。 p サフィックスは、最後の置換に指定された プリントサフィックスを反転します。現在行番号は、最後に置換が発生 した行に設定されます。

(.,.)t(.)
指定した範囲の行を、コマンド文字の右辺に指定した行番号の後にコ ピー (つまり転送) します。コピー先の行番号としては、 0 (ゼロ) の 指定が許されています。現在行番号は、コピーした一番最後の行の行番 号に設定されます。

u
最後に実行したコマンドの実行結果を取り消し、現在行番号を、取り消 したいコマンドが実行される前のものに戻します。グローバルコマンド である gGvV については、その改変は 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
以降の読み書きで用いられる暗号化鍵の入力を促します。改行のみが入 力されると、暗号化は解除されます。それ以外の場合、キー読み込み中 のエコーは抑制されます。暗号化および復号化は bdes(1) アルゴリズム を用いて行われます。

(.+1)zn
指定した行から一度に n 行だけスクロールします。 n が指定されない 場合には、現在のウィンドウサイズだけスクロールします。現在行番号 は、最後に表示した行の行番号に設定されます。

!command
command
で指定したコマンドを、 sh(1) を用いて実行します。 command の最初の文字が ‘!’ の場合には、その文字は直前に !command で実行し たコマンド文字列が格納されます。 command 文字列をバックスラッシュ (\) でエスケープした場合には、 ed ユーティリティは処理を行ないま せん。しかし、エスケープされない % 文字があった場合には、その文字 列はデフォルトファイル名に置き換えられます。シェルがコマンド実行 から戻ってきた場合には、 ‘!’ が標準出力に出力されます。現在行番号 は変更されません。

($)=
指定された行の行番号を表示します。

(.+1)newline
指定した行を表示します。そして、現在行番号を表示した行のものに設 定します。

関連ファイル

       /tmp/ed.*

バッファファイル
ed.hup
端末が回線切断した場合に、 ed がバッファ内容を書き出すファイル

関連項目

bdes(1), sed(1), sh(1), vi(1), regex(3)

USD:12-13

       B. W. Kernighan and                             P. J. Plauger,                                              Software Tools in Pascal,     1981,             Addison-Wesley.

制限

ed ユーティリティは、 file 引数に対してバックスラッシュエスケープ処理を施 します。つまり、ファイル名中でバックスラッシュ (\) を前につけた文字は、リ テラルとして解釈されます。

(バイナリではない) テキストファイルの最後が改行文字で終っていない場合、 ed はそれを読み書きする際に改行文字を追加します。バイナリファイルの場合 は、 ed はこのような改行文字追加は行いません。

1 行あたりのオーバヘッドは整数 4 つ分です。

診断

エラーが発生すると、 ed は ‘?’ を表示し、コマンドモードに戻るか、スクリプ トによる実行のエラーの場合にはプログラムを終了します。最後のエラーメッ セージについての説明は、 h (help) コマンドを用いることで表示可能です。

g (global) コマンドは、検索や置換が失敗したというエラーを隠蔽します。その ため、スクリプトの中で条件つきコマンド実行を行なわせるのによく使われま す。例えば

g/old

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

歴史

ed コマンドは Version 1 AT&T UNIX で登場しました。

バグ

ed ユーティリティは、マルチバイト文字を認識しません。

FreeBSD 10.0 July 3, 2004 FreeBSD 10.0

スポンサーリンク