ここまでの説明だけでも、edを使うことは可能ですが、使いやすさを考えると不十分です。もっとも、edは限定された環境で使うものなので、使いやすさと言ってもさほど使いやすくなるわけではありませんが…。
まずは、置換です。置換は、s/old/new/で、既存のoldをnewに置き換えます。sはswitchでしょうか。
@.
azami 192.168.45.99
@s/99/199/
@.
azami 192.168.45.199
@
この置換は、行単位で一番最初に一致した文字列のみを置換します。もし、一致する文字列すべてを変換したいときは、gオプションを付加します。gはglobalでしょうか。
@.
松島や、あー松島や、松島や
@s/松島/山寺/g
#gオプションを使って置換
@.
山寺や、あー山寺や、山寺や #松島がすべて山寺に置換された
@s/山寺/松島/
#gオプションを使わない、デフォルトの動作
@.
松島や、あー山寺や、山寺や #最初の山寺しか置換されない
@
当然、このコマンドも行を指定して実行することができます。
@,p
sakura 192.168.45.3
nadesico 192.168.45.4
tampopo 192.168.45.7
mimoza 192.168.45.8
azami 192.168.45.99
@,s/9/3/g
#gを指定しないと行単位で最初に一致する文字列ひとつしか置換されない
@,p
sakura 132.168.45.3
nadesico 132.168.45.4
tampopo 132.168.45.7
mimoza 132.168.45.8
azami 132.168.45.33
#gを指定していないときは99は置換されない。
@
結構便利そうに思えますが、複数行に対して置換を実行するような複雑な処理をedでやるのは危険です。edが必要とされるような場面は非常事態でしょう
し、edでは、テキスト全体が見にくいので修正も簡単にはいかない場合があります。こういうときは、許すかぎり他のマシンで編集したファイルをもってきて
上書きしてやる方がいいでしょう。置換は、"c"のかわりに使うぐらいにとどめておくほうが無難だと思います。
"c"を使って、ownerをuserに書き換える。
@.
/dev/cdrom
/mnt/cdrom
iso9660 noauto,owner,ro 0 0
@c
/dev/cdrom
/mnt/cdrom
iso9660 noauto,user,ro 0 0 #テキスト入力する
.
#テキスト入力終了
@.
/dev/cdrom
/mnt/cdrom
iso9660 noauto,user,ro 0 0
"c"を使って書き換えると一行まるごと入力する必要があります。つまり、修正の必要のない部分まで新たに書きなおす必要があるのです。
置換でownerをuserに書き換える。
@.
/dev/cdrom
/mnt/cdrom
iso9660 noauto,owner,ro 0 0
@s/owner/user/
@.
/dev/cdrom
/mnt/cdrom
iso9660 noauto,user,ro 0 0
@
置換だと、s/owner/user/ですみますし、修正を必要としない部分を書きなおす無駄と危険をはぶくことができます。
次に、検索です。現在行から後方に検索するときは、"/文字列"とします。現在行から前方へ検索をかけるときは"?文字列"とします。ただ、"/文字列"
も"?文字列"も最終行、開始行で検索を折り返してくれるので、検索する文字列がファイル内にひとつしかないときはどちらでもかわりません。また、続けて
同じ文字列の検索をかけるときは、それぞれ/、?とします。ただ、この検索は最終行、開始行で折り返してくれるので、漠然と繰り返していると無限に繰り返
すことになりますので気をつけましょう。manには、"/文字列/"、"?文字列?"と書かれているかもしれませんが、"/文字列"、"?文字列"も使えるようです。ここではより単純な方を使うことにします。
,pで全体が把握できるような場面では、検索は無意味なのですが、わかりやすさのため
@,p
sakura 192.168.45.3
nadesico 192.168.45.4
tampopo 192.168.45.7
mimoza 192.168.45.8
azami 192.168.45.99
@?5.8
#最終行から前方に5.8を探す
mimoza 192.168.45.8
#見つかった
@?am
#次に、ここから前方にamを探す
tampopo 192.168.45.7
#見つかった
@?
#再び、ここから前方にamを探す
azami 192.168.45.99
#開始行にまで行った検索は、最終行から現在行へと検索をかける
@
こんな感じです。これを読んだだけではわかりにくいかもしれませんが、実際やってみればそうでもないと思います。
s/old/new/
|
最初に一致したoldをnewに置換する。すべてのoldをnewに置換するには、s/old/new/gとする。
|
/文字列
/文字列/
|
現在行から後方へ文字列を検索する。/(//)とすると再検索する。最終行へたどりつくと開始行から現在行へと検索を続ける。
|
?文字列
?文字列?
|
現在行から前方へ文字列を検索する。?(??)とすると再検索する。開始行へたどりつくと最終行から現在行へと検索を続ける。
|
これまでのコマンドを使いこなせれば、実際の場面で困ることはそうないと思います。以下は、知らなくてもかまわないが、知っていると便利なものを取り上げます。
"u"は最後に実行したバッファ変更に対するコマンドを取り消します。
@.
query-source address * port 53;
@s/que/#que/
#置換で書き換える
@.
#どうなったか確認
#query-source address * port 53; # #が追加されている
@u
#前回のコマンドを取り消し
@.
#どうなったか確認
query-source address * port 53; #もとに戻っている。
@
"Q"は、バッファを破棄してedを終了します。当然と言えば当然ですが、いったんwで書き込んだら、"u"でも取り消せないし、"Q"でも破棄できませんのでwは慎重に実行しましょう。
最後は、"!"です。!commandとするとシェルコマンドcommandを実行することができます。比較的便利なのは、ヴューワーの実行でしょう。
edでは、テキスト全体を把握するのはなかなか大変です。ですので、全体の把握に、lessなどを使えれば便利です。もっとも、edが必要な状況では
lessさえ動かなかったりするのですが…。
現在、/etc/ntp.confを編集中だとして
@!less /etc/ntp.conf
#
# Drift file. Put this in a directory which the daemon can write
to.
# No symbolic links allowed, either, since the daemon updates the file
# by creating a temporary in the same directory and then rename()'ing
# it to the file.
#
driftfile /etc/ntp/drift
lessの画面〜以下略〜
@
この場合、lessを終了させると、edのコマンドモードに戻ります。"!"は、別に現在実行中のedに関係のないコマンドでも実行可能です。たんにedがバックグランドにいくだけだと考えてもよさそうです。
ほかにも、"r"や"W"など、編集中のファイルと他のファイルを結合するコマンドなどがあるのですが、これら複雑な処理はedでやらなくてもいいような気がしますので、ここでは取り上げません。
u
|
最後に実行したバッファ変更のコマンドを取り消す。
|
Q
|
バッファを破棄してedを終了する。
|
!command
|
シェルコマンドcommandを実行する。
|