next up previous contents
Next: A.14 正規表現 Up: A. vi 入門 Previous: A.12 日本語も使ってみよう(viの日本語対応)

A.13 グローバルな置換

viには「exモード」と呼ばれるモードがあります。exは、vi以前に使用されていたラインエディターです。現在では単独で用いられることは、めったにありませんが、その遺産はviの内部に生き残っています。その機能のうちのいくつかは、viのコマンドモードを強化する役割をはたしています。単なる補助ではなく、むしろviの一部と思ってください。 exモードに移るには :(コロン)を押します。すると、カーソルは最下行に移動します。exモードのコマンドは、この行に打ち込みます。 exコマンドの中で最も頻繁に用いられるのが、置換コマンドs です。

:s/文字列1/文字列2/

この命令は、カーソルのあった行の中の、文字列1を文字列2に置き換えます。 たとえば、 :s/dog/cat/ のようにすれば、行の中のdogがcatに置き換わります。最後の/は省略可能で、 :s/dog/cat  でも同じことです。ただし、sコマンドは、そのままでは1回しか置換を行いません。 置換を行いたい文字列が、行の中に複数個あったときには、その最初のものが変化するだけです。行の中で、何回も同じ置換を繰り返したいときは、最後にgを付けます。

:s/文字列1/文字列2/g

実際には、置換をしたい行を見つけるのが重要です。そこで、sコマンドは、たいてい検索コマンドと組み合わせて用います。

:/文字列1/s/文字列2/文字列3/

この命令は、文字列1を(テキストの下向きに)検索し、その行にある文字列2を文字列3に換えます。 /文字列/ あるいは ?文字列? は、exモードでない普通のコマンドモードでも使えました。ただし、sコマンドはexコマンドなので、検索と置換を同時に行うためには、 : でexモードになる必要があります。 普通は検索したい文字列と置換したい文字列は同じ場合がほとんどです。従って通常は次のような省略を利用します。

:/文字列1/s//文字列2/

これで、文字列1を含む行を捜して、文字列1を文字列2に置き換えます。 上の命令は、1回しか検索を行いません。同じ検索・置換を繰り返して行いたい時は、どうすればいいでしょうか? exコマンドによるテキストの変更の繰り返しは、.(ピリオド)ではできません。その代わりに、別のコマンドがあります。

 & ……… exコマンドによるテキスト変更の繰り返し

exコマンドによる変更は、u および U で取り消すことができます。 ただし検索作業を含む場合には、対象が複数行になるため、Uは無効です。

もし、ある文字列を含む全ての行に対して操作を行いたいなら、先頭にgを付けます。これを「グローバルな置換」と呼びます。たとえば、ファイルの中の全ての dog を cat に置き換えたいなら、次のようにすることになります。

:g/dog/s//cat/g

検索のたびに、置換を行うかチェックすることもできます。

:g/dog/s//cat/gc

のように、最後にcを付け加えます。すると、viは1つの文字列ごとに、置換するかどうかを尋ねてきます。するのならyを押してリターン、しないのならただ単にリターンを打ち込みます。(ただし時間のロスが大きいので、viの思想から言えば、あまりお勧めできる機能ではありません。)



Noriyo Kanayama