B    ed によるファイルの作成および編集

この付録では,行編集プログラム ed を使用して,テキスト・ファイルを作成,編集 (修正),表示,保存する方法を説明します。 システムに他の編集プログラムがある場合には,そのプログラムでこれらの作業を行ってもかまいません。

ed の操作方法を学習するには,この付録にある例題をシステム上で実際に実行してみるといいでしょう。 例は次第に内容が難しくなるので,1 題ずつ順序正しく進んで行くことが大切です。 また,例題どおりに実行して,画面の表示が本書の例と一致するようにしてください。

例題の中では,ユーザがタイプするところはすべて太字で印刷されています。 説明の中で何かを入力するように指示がある場合は,その行の情報をすべてタイプして,Return キーを押します。

ed は行エディタなので,ファイルの内容は 1 行ずつしか編集できません。 画面には他のテキストが表示されていても,編集できるのは現在の行だけです。 画面編集プログラムを使用した経験がある場合には,そのプログラムと ed との違いをよく認識しておいてください。 たとえば,ed プログラムでは,矢印キーを使用して,現在の行を変更することはできません。

B.1    テキスト・ファイルと編集バッファ

ファイルとは,ある名前の下で,コンピュータにまとめて格納されたデータの集まりです。 普通のファイル・フォルダが,コンピュータに入ったものだと考えてください。 ファイルには,手紙やレポート,あるいはその他の文献を収めたり,コンピュータ・プログラムのソース・コードを入れたりします。

編集バッファは一時的な記憶域であり,作業中のファイルを保持するところです。 これは,一般の机の上に当たる部分です。 テキスト・ファイルで作業を行う場合,テキスト・ファイルを編集バッファに置き,そのファイルに変更を加え (編集し),その後,バッファの内容を永久的な記憶域に転送 (コピー) します。

この付録では,ed エディタを使用して,テキスト・ファイルを作成,表示,保存,編集 (修正) する方法を説明します。

B.2    テキスト・ファイルの作成と保存

テキスト・ファイルを作成して保存するには,次の手順に従ってください。 詳細については,以降の項で説明します。

  1. シェル・プロンプトから,次のコマンドを入力する。

    $ ed filename
     
    

    filename には,作成または編集するファイルの名前を指定します。

  2. ? filename のメッセージが表示された場合には,次の追加コマンドを入力する。

    a
     
    

  3. テキストを入力する。

  4. テキストの追加を終了するには,新しい行の先頭でドット (.) を入力する。

  5. 次のコマンドを入力して,編集バッファの内容をファイル filename にコピーする。

    w
     
    

  6. ed プログラムを終了するには,次のコマンドを入力する。

    q
     
    

B.2.1    ed プログラムの起動

ed プログラムを起動するには,ed filename 形式のコマンドをシェル・プロンプト ($) の後に入力します。

次の例では,ed afile コマンドにより ed プログラムを起動して,afile という名前のファイルで作業を行うことを示します。

$  ed afile
?afile
_
 

ed プログラムは,?afile というメッセージを表示します。 これは,そういう名のファイルが存在しないことを意味します。 ここで,a (追加) サブコマンドを使用して,afile を作成し,テキストを入力することができます。 このサブコマンドについては,次の項目で説明します。

B.2.2    テキストの入力 - a (追加) サブコマンド

ファイルにテキストを追加するには,a を入力します。 サブコマンド a は,ユーザが入力するテキストを編集バッファに追加するように ed に対して指示します。 そのファイルにすでにテキストが入っている場合には,サブコマンド a は新しいテキストをファイルの終わりに追加します。

テキストをタイプし,各行末で Return キーを押します。 テキストを全部入力し終わったら,新しい行の先頭にドット (.) を入力します。

注意

行末で Return キーを押さない場合には,行末まで入力すると,ed プログラムが自動的にカーソルを次の行に移動します。 ただし画面上で何行入力しても,Return キーが押されるまで ed プログラムは入力されたテキストをすべて 1 行と見なします。 つまり,入力行が (ワークステーションの表示設定に基づいて) 次の行にラップされるということです。

次の例は,afile ファイルにテキストを入力する方法を示しています。

a
The only way to stop
appending is to enter a
line that contains only
a dot.
.
_
 

バッファにテキストを追加するのを一旦やめてから,また追加したくなった場合には,もう一度 a サブコマンドを入力します。 テキストをタイプし,入力が終了したら,新しい行の先頭にドット (.) を入力して,テキスト・バッファへの追加を停止します。

テキストの入力中に間違ってタイプした場合には,Return キーを押す前に訂正できます。 バックスペース・キーを使用して,間違って入力した文字を消します。 その後,正しい文字をその位置に入力します。

B.2.3    テキストの表示 - p (プリント) サブコマンド

p (プリント) サブコマンドを使用して,編集バッファの内容を表示させることができます。

1 行だけ表示させるには,サブコマンド np を使用します。 n には行番号を指定します。 たとえば,次のように入力します。

2p
appending is to enter a
_
 

数行を表示させるには,n,mp サブコマンドを使用します。 n には開始行番号,m には終了行番号を指定します。 たとえば,次のように入力します。

1,3p
The only way to stop
appending is to enter a
line that contains only
_
 

特定の行からバッファの終わりまでをすべて表示させるには,n,$p サブコマンドを使用します。 n は開始行番号,$ はバッファの最終行を意味します。 次の例では,1,$p でバッファ内の全行が表示されます。

1,$p
The only way to stop
appending is to enter a
line that contains only
a dot.
_
 

注意

この付録の多くの例では,1,$p を使用してバッファの内容を表示しています。 これらの例では,サブコマンド 1,$p はオプションですが,便利です。 このコマンドを使用すると,例中のサブコマンドが意図したとおりに動作するかどうかを確認することができます。 他に,ed には,もう 1 つ ,p という便利な用法があります。 これは,1,$p と同等のサブコマンドであり,バッファの内容を表示します。

B.2.4    テキストの保存 - w (書き込み) サブコマンド

w (書き込み) サブコマンドは,バッファの内容をファイルに書き込んだり,コピーしたりします。 ファイルの全部または一部を,もとの名前,または新しい名前で保存することができます。 いずれの場合にも,ed は指定されたファイルのもとの内容をバッファからコピーしたデータで書き換えます。

B.2.4.1    同じファイル名でのテキストの保存

もとのファイル名でバッファの内容を保存するには,w サブコマンドを入力します。

w
78
_
 

ed プログラムは,バッファの内容を afile という名前のファイルにコピーして,ファイルにコピーされた文字数 (78) を表示します。 この数字には,空白や,Return (改行とも呼ばれる) などの画面上では見えない文字も含まれます。

w サブコマンドは,編集バッファの内容には影響を与えません。 ファイルのコピーを保存した後,バッファの内容の編集作業を続けることができます。

格納されたファイルは,次に w を使用してバッファの内容をそのファイルにコピーするまで,変更されません。 安全のため,ファイルの編集作業中には,定期的にファイルを保存することをおすすめします。 こうしておくと,変更を行ったが保存したくない場合や間違いがあった場合に,以前に保存したファイルを使用して,そこからやり直すことができます。

注意

u (取り消し) サブコマンドは,ed サブコマンドで最後に修正した前の状態にバッファを戻します。 u で取り消すことのできるサブコマンドは,a, c, d, g, G, i, j, m, r, s, t, v および V です。

B.2.4.2    別のファイル名でのテキストの保存

同じファイルのコピーが複数必要なことがよくあります。 たとえば,手紙のオリジナル文を 2 つのファイルに入れておき,1 つは保管用,もう 1 つは変更用にすることができます。

これまでに説明した例を実行している場合には,オリジナルのテキストが入っている afile という名前のファイルがあります。 このファイルのコピーをもう 1 つ作成するには (内容をバッファに入れたままで),w filename 形式のサブコマンドを,次の例のように使用します。

w bfile
78
_
 

この時点では,afilebfile は,同じバッファの内容をコピーしたものであるので,内容は同じです。 ただし,afilebfile は別個のファイルなので,相互の内容に影響を与えずに一方の内容を変更することができます。

B.2.4.3    ファイルの一部の保存

ファイルの一部を保存するには, n,mw filename 形式のサブコマンドを使用します。 このサブコマンドでは,変数は次のように使用されます。

n

保存するファイルの部分の先頭行番号を指定する。

m

保存するファイルの部分の最終行番号 (または,1 行だけ保存する場合はその行の番号) を指定する。

filename

別のファイルの名前を指定する (オプション)。

次の例では,w サブコマンドは,バッファの 1 行目と 2 行目を cfile という名前の新しいファイルにコピーします。

1,2w cfile
44
_
 

ed は,cfile に書き込まれた文字数 (44) を表示します。

B.2.5    ed プログラムの終了 - q (終了) サブコマンド

ed プログラムを終了するには,q (終了) サブコマンドを入力します。 たとえば,次のようにします。

q
$ _
 

注意

ed プログラムを終了すると,バッファの内容は失われます。 バッファ内のデータを保存するには,ed プログラムを終了する前に,w サブコマンドを使用して,バッファの内容をファイルにコピーします。

q サブコマンドを入力すると,シェル・プロンプト ($) に戻ります。

バッファを変更したが,内容のコピーをまだ保存していない場合,q サブコマンドは ? というエラー・メッセージを表示します。 このときには,w サブコマンドでバッファの内容を保存するか,再び q を入力して,バッファの内容をコピーしないで ed プログラムを終了します。

B.3    ファイルの編集バッファへのロード

ファイルを編集する前に,そのファイルを編集バッファにロードしなければなりません。 ファイルのロードは,ed プログラムを起動するとき,あるいは,プログラムの実行中に行うことができます。

ed プログラムの起動時にファイルをロードするには,次のコマンドを入力します。

ed filename
 

このコマンドにより,ed が起動し,filename というファイルが編集バッファにロードされます。

ed プログラムの実行中にファイルを編集バッファにロードするには,次のうちどちらかのコマンドを入力します。

B.3.1    ed (編集) コマンド

ed プログラムの起動時にファイルを編集バッファにロードするには,ed コマンドの後にファイル名を入力します。 次の ed コマンドは,ed プログラムを起動して,ファイル afile を編集バッファにロードします。

$ ed afile
78
_
 

ed プログラムは,編集バッファに読み取った文字数 (78) を表示します。

ed がファイルを見つけることができなかった場合,?filename というメッセージが表示されます。 そのファイルを新規に作成する場合には,a (追加) サブコマンド (B.2.2 項参照) と,w (書き込み) サブコマンド (B.2.4 項参照) を使用します。

B.3.2    e (編集) サブコマンドの使用

ed プログラムを起動すると,e (編集) サブコマンドを使用してファイルをバッファにロードすることができます。 e サブコマンドは,バッファの内容を新しいファイルで書き換えます。 e サブコマンドを,B.3.3 項で説明する r サブコマンドと比較してみてください。 r サブコマンドは,新しいファイルをバッファに追加します。

注意

新しいファイルをバッファにロードすると,バッファの以前の内容は新しいファイルで重ね書きされてしまいます。 w サブコマンドを使用してバッファのコピーを保存してから,新しいファイルをバッファに読み取るようにしてください。

次の例では,サブコマンド e cfile は,cfile という名前のファイルを編集バッファに読み取り,afile を置換します。 次に,e afile サブコマンドで cfile が消去され,afile が再びバッファに読み取られます。 e サブコマンドを実行するたびに,ed プログラムはバッファに読み取った文字数を返します (44 と 78)。

e cfile
44
e afile
78
_
 

ed がファイルを見つけることができなかった場合,? filename というメッセージを表示します。 そのファイルを新規に作成する場合には,a (追加) サブコマンド (B.2.2 項を参照) と,w (書き込み) サブコマンド (B.2.4 項を参照) を使用します。

ed プログラムを終了しなくても,複数のファイルを一度に 1 つずつ編集することができます。 e サブコマンドを使用して,ファイルをバッファにロードし,ファイルの修正が終了したら,w サブコマンドを使用して,修正したファイルのコピーを保存します。 w サブコマンドの詳細については,B.2.4 項 を参照してください。 次に,再び e サブコマンドを使用して,別のファイルをバッファにロードします。

B.3.3    r (読み取り) サブコマンドの使用

ed プログラムを起動すると,r (読み取り) サブコマンドを使用して,ファイルをバッファに読み取ることができます。 r サブコマンドはファイルの内容をバッファの内容に追加します。 r サブコマンドは,バッファの内容を消去しません。 r サブコマンドを,B.3.2 項で説明した e サブコマンドと比較してみてください。 e コマンドは,新しいファイルを読み取る前にバッファの内容を削除します。

r サブコマンドを使用して,ファイルをバッファ内の特定の場所に読み取ることができます。 たとえば,4r cfile サブコマンドは,行番号 4 の後に cfile というファイルを読み取ります。 ed プログラムは,その後バッファ内の行番号をつけ直します。 行番号を指定しない場合には,r サブコマンドは,新しいファイルをバッファの内容の終りに追加します。

次の例では,r サブコマンドを行番号を指定して使用する方法を示します。

1,$p
The only way to stop
appending is to enter a
line that contains only
a dot.
3r cfile
44
1,$p
The only way to stop
appending is to enter a
line that contains only
The only way to stop
appending is to enter a
a dot.
_
 

サブコマンド 1,$pafile の 4 行を表示します。 次に,3r cfile サブコマンドが,cfile の内容をバッファ内の行番号 3 の後にロードして,バッファに 44 文字が読み取られたことを示します。 次のサブコマンド 1,$p がバッファの内容を再び表示して,r サブコマンドでバッファ内の行番号 3 の後に cfile が読み込まれたことが確認できます。

システム上で例題を実行している場合には,次に進む前に,以下の作業を行ってください。

  1. バッファの内容を cfile ファイルに保存する。

    w cfile
     
    

  2. バッファに afile ファイルをロードする。

    e afile
     
    

B.4    現在の行の表示と変更

ed プログラムは行エディタです。 つまり,ed では,バッファの内容を一度に 1 行ずつ編集します。 ある時点において作業できる行を現在の行といい,この行はドット (.) で示されます。 ファイルの別の部分を編集するには,現在の行を変更しなければなりません。

現在の行を表示させるには,次のサブコマンドを入力します。

p
 

現在の行の行番号を表示するには,次のサブコマンドを入力します。

.=
 

注意

矢印キーを使用して,現在の行を変えることはできません。 現在の行を変えるには,以降の項で説明する ed サブコマンドを使用します。

バッファ内で位置を変更するには,次のうちのいずれかを行います。 詳細については,以降の項で説明します。

  1. 現在の行を行番号 n に設定するには,次のサブコマンドを入力する。

    n
     
    

  2. 現在の行をバッファ内で 1 行ずつ前に進めていくには,Return キーを押す。

  3. 現在の行をバッファの中で 1 行ずつ後に戻していくには,ダッシュ (-) を入力する。

  4. 現在の行をバッファの中で n 行前に進めていくには,次のサブコマンドを入力する。

    .+n
     
     
    

  5. 現在の行をバッファの中で n 行後ろに戻していくには,次のサブコマンドを入力する。

    .-n
     
     
    

B.4.1    バッファ内での位置付け

最初にファイルをバッファにロードする場合,ファイルの最後の行が現在の行になります。 ファイルで作業を行っているときには,通常,現在の行を何回も変えます。 現在の行およびその行番号はいつでも表示することができます。

現在の行を表示するには,p を入力します。

p
a dot.
_
 

p サブコマンドは,現在の行 (a dot.) を表示します。 afile を読み取ってから現在の行を変更していないので,現在の行はバッファ内の最後の行です。

現在の行の行番号を表示するには,.= を入力します。

.=
4
_
 

afile には 4 行あり,現在の行がバッファ内の最後の行であるため,.= サブコマンドは 4 を表示します。

また,$ (バッファの最後の行を表わす記号) を = サブコマンドと一緒に使用して,バッファ内の最後の行を判断することもできます。

$=
4
_
 

$= サブコマンドを使用すると,バッファ内の行数を簡単に知ることができます。 ed$ 記号はシェル・プロンプト ($) とは何の関係もありません。

B.4.2    バッファ内での位置の変更

バッファ内の位置の変更 (現在の行の変更) は,次のいずれかの方法で行います。

現在の行を特定の行に移すには,行番号を入力します。 ed は新しい行番号を表示します。 次の例では,afile の最初の行が現在の行になります。

1
The only way to stop
_
 

Return キーを押すとバッファ内を 1 行ずつ前に進んでいき,新しい現在の行を次の例のように表示します。

appending is to enter a
 
line that contains only
 
a dot.
 
?
_
 

バッファの最後の行の次に移動しようとすると,ed は,エラー・メッセージ ? を表示します。 バッファの最後の行の次には移動できません。

現在の行を,バッファの最後の行に設定するには,$ を入力します。

現在の行を,バッファ内で 1 行ずつ後ろに戻すには,次に示すようにマイナス符号 (-) を次々と入力します。

-
line that contains only
-
appending is to enter a
-
The only way to stop
-
?
_
 

バッファの最初の行より上に移動しようとすると,ed は,エラー・メッセージ ? を返します。 バッファの最初の行より先には移動できません。

現在の行を,バッファの中で一度に 2 行以上前に移動するには,.n を入力します。 n は移動する行数を指定します。

.2
line that contains only
_
 

.2.+2 の簡略な形式です。

現在の行を,バッファの中で一度に 2 行以上後に移動するには,サブコマンド .-n を入力します。 n は移動する行数を指定します。

.-2
The only way to stop
_
 

B.5    テキストの探索

特定の単語や文字列がある行の行番号がわからない場合,文脈探索を使用してその行を探すことができます。

文脈探索は,次のいずれかを行います。

次の項で,テキストを探索する方法について詳しく説明します。

B.5.1    バッファ内での順方向探索

バッファ内を順方向に探索するには,文字列をスラッシュ ( / / ) で囲んで入力します。

/only/
line that contains only
_
 

文脈探索 (/only/) は,現在の行の次の行から始まり,文字列 "only" を含む次の行を探索して表示します。 そして,その行が現在の行になります。

ed が該当する文字列を探索の先頭行からバッファの最終行までの間で見つけることができなかった場合は,探索を 1 行目から現在の行まで続けて行います。 ed がバッファ全体を探索しても文字列が見つからない場合には, エラー・メッセージ ? を表示します。

/random/
?
_
 

文字列を一度探索すると,// を入力することで同じ文字列をもう一度探索することができます。 次の例では,only という文字列を一度探索した後,同じ文字列をもう一度探索します。

/only/
The only way to stop
//
line that contains only
_
 

B.5.2    バッファ内での逆方向探索

バッファ内を逆方向に探索するのは,順方向に探索する場合と同様に行います。 ただし,逆方向の探索では,文字列を疑問符 (?) で囲みます。

?appending?
appending is to enter a
_
 

文脈探索は,現在の行の 1 行前から始まり,文字列 appending を含む最初の行を探します。 そして,その行が現在の行になります。 ed がバッファ全体を探索しても該当する文字列を見つけることができない場合は,現在の行で探索を中止して,エラー・メッセージ ? を表示します。

逆方向に文字列探索した後,?? を入力すると,同じ文字列をもう一度逆方向に探索することができます。 これは,ed が探索する文字列を記憶しているためです。

B.5.3    探索方向の変更

スラッシュ ( / ) と疑問符 (?) の探索文字を交互に使用することにより,ある文字列の探索の方向を変えることができます。

/only/
line that contains only
??
The only way to stop
_
 

文字列を探索するときに行き過ぎてしまった場合などに,探索方向が変えられるので便利です。

B.6    置換 - s (置換) サブコマンド

s (置換) サブコマンドを使用すると,ある文字列 (1 つ以上の文字) を別の文字列で置き換えることができます。 s サブコマンドは,一回に 1 行または複数行に対して処理を行います。 このサブコマンドは,特に,タイプミスやスペルミスを訂正する場合に便利です。

置換を行うには,次のいずれかを行います。

次の各項で,置換方法について詳しく説明します。

B.6.1    現在の行での置換

現在の行で置換を行う前に,まず変更したい行が現在の行であることを確認します。 次の例では,/appending/ (探索) サブコマンドで,変更する行を探します。 次に,s/appending/adding text/p (置換) サブコマンドで,現在の行にある文字列 appendingadding text に置き換えます。 その後,p (プリント) サブコマンドで,変更した行を表示します。

/appending/
appending is to enter a
s/appending/adding text/p
adding text is to enter a
_
 

注意

操作を簡単にするため,p (プリント) サブコマンドを s サブコマンドに追加することができます。 たとえば,s/appending/adding text/p のように指定します。 これにより,置換の結果を確認するために p サブコマンドを別にタイプする手間が省けます。

s サブコマンドは,該当する行で最初に見つけた文字列だけを置き換えます。 1 行にあるすべての該当する文字列を置き換える方法については,B.6.4 項を参照してください。

B.6.2    特定の行での置換

特定の行で置換を行うには,次の形式のサブコマンドを使用します。

n s/ oldstring / newstring /

n は,置換を行う行の番号です。 次の例では,s サブコマンドで行番号 1 に移動し,文字列 "stop" を "quit" に置き換えて,新しい行を表示します。

1s/stop/quit/p
The only way to quit
_
 

s サブコマンドは,指定行で最初に見つけた該当文字列だけを置き換えます。 1 行にあるすべての該当する文字列を置き換える方法については,B.6.4 項を参照してください。

B.6.3    複数行での置換

複数行で置換を行うには,次の形式のサブコマンドを使用します。

n,m s/ oldstring / newstring /

n は置換を行う先頭行であり,m は最終行です。 次の例では,s サブコマンドは,バッファ内の各行で最初に見つかった文字列 "to" を "TO" に置き換えます。

1,$s/to/TO/
1,$p
The only way TO quit
adding text is TO enter a
line that contains only
a dot.
_
 

1,$p サブコマンドはバッファの内容を表示するので,置換が行われたことを確認できます。

B.6.4    すべての該当文字列の置換

通常,s (置換) サブコマンドは,指定行で最初に探索された該当文字列のみを置き換えます。 ただし,g (グローバル) 演算子を指定すると,1 行または複数行にあるすべての該当文字列を置き換えることができます。

1 行についてグローバル置換を行うには,次の形式のサブコマンドを使用します。

n s/ oldstring / newstring /

次の例では,3s/on/ON/gp は,行番号 3 で探索されたすべての文字列 "on" を "ON" に置き換えて,新しい行を表示します。

3s/on/ON/gp
line that cONtains ONly
_
 

複数行についてグローバル置換を行うには,次の形式のサブコマンドで,行のグループを指定します。

n,m s/ oldstring / newstring /g

次の例では,1,$s/TO/to/g は,バッファ内のすべての行で,文字列 "TO" を文字列 "to" に置き換えます。

1,$s/TO/to/g
1,$p
The only way to quit
adding text is to enter a
line that cONtains ONly
a dot.
_
 

B.6.5    文字の削除

s サブコマンドを使用して,文字列を削除する (つまり,文字列を空列で置き換える) ことができます。 文字を削除するには,s/oldstring// 形式でサブコマンドを指定します。 このとき,最後の 2 つの / の間にはスペースを入れないでください。

次の例では,ed は文字列 "adding" を行番号 2 から削除し,変更した行を表示します。

2s/adding//p
text is to enter a
_
 

B.6.6    行頭と行末での置換

次の 2 つの特殊文字を使用すると,行頭あるいは行末で置換を行うことができます。

^ (カレット)

行頭で置換を行う。

$ (ドル記号)

行末で置換を行う。 この場合には,ドル記号 ($) はバッファ内の最後の行を表していない。

行頭で置換を行うには,s/newstring/ (新文字列) サブコマンドを使用します。 次の例では,最初のs サブコマンドで,文字列 "Remember" を行番号 1 の先頭に追加します。 2 番目のs サブコマンドは,文字列 "adding" を行番号 2 の先頭に追加します。

1s/^/Remember,/p
Remember, The only way to quit
2s/^/adding/p
adding text is to enter a
_
 

行末で置換を行うには,s/$/newstring (新文字列) 形式のサブコマンドを使用します。 次の例では,s サブコマンドで,文字列 "Then press Enter." を行番号 4 の末尾に追加します。

4s/$/  Then press Enter./p
a dot.  Then press Enter.
_
 

Then の前にスペースを 2 つ入れて,2 つの文を分けていることに注意してください。

B.6.7    文脈探索の使用

変更する行の行番号がわからない場合には,文脈探索を使用して探すことができます。 文脈探索についての詳細は,B.5 節を参照してください。

操作を簡単にするため,次の形式のように,文脈探索と置換を組み合わせてひとつのサブコマンドにすることができます。

/string to find/ s/ oldstring / newstring /

次の例では,ed は文字列 ", The" を含む行を探して,その文字列を ", the" に置き換えます。

/, The/s/, The/, the/p
Remember, the only way to quit
_
 

探索文字列を置換する文字列として使用することもできます。 この場合は,/string to find/s//newstring/ という形式のサブコマンドを使用します。 次の例では,ed は,文字列 "cONtains ONly" を含む行を探し,その文字列を "contains only" に置き換えて,変更された行を表示します。

/cONtains ONly/s//contains only/p
line that contains only
_
 

B.7    行の削除 - d (削除) サブコマンド

d (削除) サブコマンドを使用して,バッファから 1 つ以上の行を削除できます。 d サブコマンドの一般形式は,次のとおりです。

starting line,endingline  d

行を削除した後,ed は現在の行を,削除された行の次の行に設定します。 バッファの最終行を削除した場合には,バッファに残っている最後の行が現在の行となります。 削除後,ed はバッファに残っている行の番号を付けなおします。

バッファから行を削除するには,次のようにします。

以降の各項で,行を削除する方法について詳しく説明します。

B.7.1    現在の行の削除

現在の行を削除する場合には,d を入力します。 次の例では,1,$p サブコマンドはバッファの内容を全部表示し,$ サブコマンドがバッファの最終行を現在の行にします。

1,$p
Remember, the only way to quit
adding is to enter a
line that contains only
a dot.  Then press Enter.
$ 
a dot.  Then press Enter
d
_
 

最後に,d サブコマンドが,現在の行 (この場合,バッファ内の最後の行) を削除します。

B.7.2    特定の行の削除

削除する行の行番号がわかっている場合は,nd 形式のサブコマンドを使用します。 次の例では,2d サブコマンドでバッファから行番号 2 を削除します。

2d
1,$p
Remember, the only way to quit
line that contains only
_
 

1,$p サブコマンドによりバッファの内容を表示して,その行が削除されたことを確認します。

B.7.3    複数行の削除

複数行をバッファから削除するには, n,md 形式のサブコマンドを使用します。 n は削除する複数行の先頭行番号であり,m は最終行番号です。

次の例では,1,2d サブコマンドは行番号 1 および 2 を削除します。

1,2d
1,$p
?
_
 

1,$pサブコマンドはメッセージ ? を表示して,バッファが空であることを示します。

システムで実際に例題を実習している場合は,次の節に進む前にバッファの内容をリストアします。 次の例で,バッファの内容をリストアする方法を示します。

e afile
?
e afile
78
_
 

この一連のコマンドは,元のファイル afile のコピーをバッファ内に読み込みます。

B.8    テキストの移動 - m (移動) サブコマンド

m (移動) サブコマンドを使用して,複数行をバッファの中のある位置から別の位置に移動することができます。 移動後,移動された最後の行が現在の行になります。

テキストを移動するには,次の形式のサブコマンドを入力します。

x,y  m z

x は移動するグループの先頭行番号,y は移動するグループの最終行番号,z は移動先の直前の行番号です。

次の例では,1,2m4 サブコマンドは,バッファの最初の 2 行を行番号 4 の直後に移動します。

1,2m4
1,$p
line that contains only
a dot.
The only way to stop
appending is to enter a
_
 

1,$p サブコマンドは,バッファの内容を表示して,移動が完了したことを示します。

複数行をバッファの先頭に移動するには,移動先の行番号として,ゼロ (0) を指定します。 次の例では,3,4m0 サブコマンドにより,行番号 3 と 4 をバッファの先頭に移動します。

3,4m0
1,$p
The only way to stop
appending is to enter a
line that contains only
a dot.
_
 

1,$p サブコマンドは,バッファの内容を表示して,移動が行われたことを示します。

複数行をバッファの末尾に移動するには,移動先の行番号として,$ を指定します。

1,2m$
1,$p
line that contains only
a dot.
The only way to stop
appending is to enter a
_
 

B.9    テキスト行の変更 - c (変更) サブコマンド

c (変更) サブコマンドを使用して,1 行または複数の行を,1 行または複数の新しい行と置き換えることができます。 c サブコマンドは,まず置き換えたい行を削除した後,a (追加) サブコマンドと同様に新しい行を入力できるようにします。 新しいテキストを入力し終わったら,次の行にドット (.) だけを入力します。

c サブコマンドの一般形式は,次のとおりです。

starting line,endingline  c

テキスト行を変更するには,次のようにします。

  1. 次の形式のサブコマンドを入力する。

    n,m c
     
    

    n は削除するグループの先頭行番号,m は削除するグループ (または 1 行だけ) の最終行番号を指定します。

  2. 新しい行をタイプして,各行の終わりでは Return キーを押す。

  3. 最後の行にドット (.) だけを入力する。

次の各項で,テキストを変更する方法について詳しく説明します。

B.9.1    1 行のみの変更

テキストを1行だけ変更するには,c (変更) サブコマンドに行番号を 1 つだけ指定します。 この 1 行を必要な行数で置き換えることができます。

次の例では,2c サブコマンドで行番号2をバッファから削除した後,新しいテキストを入力することができます。

2c
appending new material is to
use the proper keys to create a
.
1,$p
The only way to stop
appending new material is to
use the proper keys to create a
line that contains only
a dot.
_
 

行にドット (.) だけを入力すると,ed によるバッファへのテキストの追加が終了します。 1,$p サブコマンドは,バッファの内容全体を表示して,変更が行われたことを示します。

B.9.2    複数行の変更

テキスト行を 2 行以上変更するには,c サブコマンドで変更したい範囲の先頭行番および最終行番号を指定します。 この複数行は 1 行以上で置き換えることができます。

次の例では,2,3c サブコマンドで行番号 2 と 3 をバッファから削除した後,新しいテキストを入力しています。

2,3c
adding text is to enter a
.
1,$p
The only way to stop
adding text is to enter a
line that contains only
a dot.
_
 

行にドット (.) だけを入力すると,ed によるバッファへのテキストの追加が終了します。 1,$p サブコマンドは,バッファの内容全体を表示して,変更が行われたことを示します。

B.10    テキストの挿入 - i (挿入) サブコマンド

i (挿入) サブコマンドを使用して,バッファに 1 行以上の新しい行を挿入できます。 新しい行を挿するバッファの位置を決めるには,行番号を指定するか,または文脈探索を使用します。 i サブコマンドは,指定された行の直前に新しい行を挿入します。 i サブコマンドを,B.2.2 項で説明している a サブコマンドと比較してください。 a サブコマンドは,新しい行を指定行の後に挿入します。 テキストを挿入するには,次のようにします。

  1. 次のいずれかのサブコマンドを入力する。

    ni
     
    

    n は,新しい行が直前に挿入される行の行番号です。

    /string/i
     
    

    string は,新しい行が直前に挿入される行に含まれている文字列を指定します。

  2. 新しい行を入力する。

  3. 最後の行の先頭にドット (.) を入力する。

次の各項で,テキストを挿入する方法について詳しく説明します。

B.10.1    行番号の使用

新しい行を挿入する先の行番号がわかっている場合は,挿入サブコマンドを ni 形式で使用できます。 n には行番号を指定します。 入力した新しい行はバッファ内の行番号 n の前に挿入されます。 i サブコマンドを終了するには,最後にドット (.) だけの行を入力します。

次の例では,まず,1,$p サブコマンドでバッファの内容を表示します。 つぎに,4i サブコマンドが行番号4の直前に新しい行を挿入します。

1,$p
The only way to stop
adding text is to enter a
line that contains only
a dot.
4i
--repeat, only--
.
1,$p
The only way to stop
adding text is to enter a
line that contains only
--repeat, only--
a dot.
_
 

4i を入力した後に,新しいテキスト行を入力し,次の行にドットだけを入力して,i サブコマンドを終了します。 2 回目の 1,$p サブコマンドでバッファの内容が表示され,新しいテキストが挿入されたことを示します。

B.10.2    文脈探索の使用

i サブコマンドで新しい行を挿入する位置を指定するもうひとつの方法に文脈探索があります。 /string /i 形式のサブコマンドを使用して string を含む行を探し,その行の直前に新しい行を挿入します。 新しい行の挿入が終了したら,行の先頭でドットを入力します。

次の例では,/dot/i サブコマンドにより,文字列 "dot" を含んでいる行の直前に新しいテキストを挿入します。

/dot/i
and in the first position--
.
1,$p
The only way to stop
adding text is to enter a
line that contains only
--repeat, only--
and in the first position--
a dot.
_
 

1,$p サブコマンドでバッファの内容をすべて表示し,新しくテキストが挿入されたことを示します。

B.11    行のコピー - t (転送) サブコマンド

t (転送) サブコマンドを使用して,バッファ内のある位置にある行を,他の位置にコピーすることができます。 t サブコマンドは,元の行に影響を与えません。

t サブコマンドの一般形式は,次のとおりです。

starting line,endingline  t line to follow

行をコピーするには,次の形式のサブコマンドを入力します。

n,m tx
 

n はコピーする範囲の先頭行番号,m はコピーする範囲の最終行番号,x はコピー先の直前の行番号です。

行をバッファの先頭にコピーするには,コピー先の直前の行番号として,ゼロ (0) を指定します。 行をバッファの最後にコピーするには,コピー先の直前の行番号として,ドル記号 ($) を指定します。

次の例では,1,3t4 サブコマンドで行番号 1 から 3 までをコピーし,その内容を行番号 4 の後に挿入します。

1,3t4
1,$p
The only way to stop
adding text is to enter a
line that contains only
--repeat, only--
The only way to stop
adding text is to enter a
line that contains only
and in the first position--
a dot.
_
 

1,$p サブコマンドはバッファの内容をすべて表示して,ed により行のコピーが挿入され,もとの行はそのまま残っていることを示します。

B.12    ed からのシステム・コマンドの使用

ed プログラムを終了せずにシステム・コマンドを使用する方が便利なことがあります。 その場合には,感嘆符 (!) を使用すると,ed プログラムから一時的に出ることができます。

ed からシステム・コマンドを使用するには,次のように入力します。

!command
 

次の例では,!ls コマンドで一時的に ed プログラムを停止して,ls (リスト) システム・コマンド (現在のディレクトリ内のファイルをリストするコマンド) を実行します。

!ls
afile
bfile
cfile
!
_
 

ls コマンドは現在のディレクトリにあるファイルの名前 (afile, bfile, cfile) を表示した後,! を表示します。 ls コマンドが実行され,続けて ed を使用できます。

ed プログラム内からどのシステム・コマンドでも使用できます。 別の ed プログラムを実行して,ファイルを編集した後,元の ed プログラムに戻ることもできます。 2 番目の ed プログラムから,3 番目の ed プログラムを実行したり,システム・コマンドを使用したりすることもできます。

B.13    ed プログラムの終了

これで ed プログラムの紹介を終わります。 ファイルを保存して,ed プログラムを終了するには,次の手順に従ってください。

  1. w コマンドを次のように入力する。

    w
     
    

  2. q コマンドを次のように入力する。

    q
     
    

w サブコマンドおよび q サブコマンドの詳細については,それぞれ,B.2.4 項およびB.2.5 項を参照してください。

他の ed の機能については, ed(1) リファレンス・ページを参照してください。

ed で作成したファイルの印刷方法の詳細については,第 3 章を参照してください。