2009-11-09

vi & 置換

vi で全文置換する時は、コマンド・モード (インサート・モードにいる時は ESC を押すとコマンド・モードに入れる) で「:」を入力した後、次のやうにする。

%s/foo/bar/g

上の例は、「foo」という文字列を「bar」に置換している。

&

さて、ここで「&」といふものの使い方を紹介しませう。この「&」を置換側で使うと、置換元の文字列へと展開される。例えば、「Eulenspiegel」を「Till Eulenspiegel」としたい場合、次のコマンドを打つ:

%s/Eulenspiegel/Till &/g

もし & を使わなかったら、かうなる:

%s/Eulenspiegel/Till Eulenspiegel/g

なんか置換側を typo してしまいそう。それに比べて、「&」一つで済むのはスマート!

C と &&

普段、vi を使わないぼくがこんなエントリーを書いているのは、この「&」におもいっきしハマったから。

というのも、vi 使いの人が置換が変になると言ってぼくに相談してきた。その時、彼は C のコードを修正していて、確かこんなコード

#if defined(FOO) || defined (BAR)

を、次の形に置換しやうとしていた。

#if !defined(FOO) && !defined(BAR)

それで使っちゃった置換式がこれ。

%s/#if defined(FOO) || defined (BAR)/#if !defined(FOO) && !defined(BAR)/g

見事にハマった。結局、& を \ でエスケープしたら通った。

%s/#if defined(FOO) || defined (BAR)/#if !defined(FOO) \&\& !defined(BAR)/g

vi。奥が深い。

No comments:

Post a Comment