vim: ed コマンドを使う
こんにちは。 転職して 2 ヶ月になる kyagi です。梅雨も明けていよいよ本格的な夏到来ですね。弊社の技術部は私服で勤務オーケーなので、このごろはgraniphでまとめ買いしたTシャツを着て通勤しています。
vi の使用法が好評を博しているということで、私も一席。ネタは「vi で ed コマンドを使う」です。
さっそくはじめましょう。
shell, perl スクリプトを書いている時に、ある範囲の行をコメントアウトしたくなる時がありませんか?そんなときいちいち、移動と削除を繰り返し入力するのは面倒くさいですよね。この操作を楽チンに実現する方法をお伝えします。
ed の基本的な構文は「ある範囲の行(パターン)」を「なになにする(アクション)」というものです。まず set nu で行番号を表示します。
:set nu
コメントアウトする部分を特定した後、置換を実行します。例えば 20 行目から 30 行目をコメントアウトしたいなら以下を実行します。
:20,30s/^/#/
元の状態に戻す(コメントを付けていない状態)には以下を実行します。
:20,30s/^#//
この「ある範囲の行(パターン)」を「なになにする(アクション)」という考え方は ed だけでなく sed, awk といった言語を理解するキモであり、 perl でのフィルタ作成にも通じるものです 。「ある範囲の行」というのを、ここでは 20-30 行目という具体的な行数をあげていますが、正規表現 を使用してパターンとして指定することも可能です。
前回の「ですくとっぷLinux」で弊社岡野が /etc/ssh/sshd_config に対して行った編集をed を使ってスクリプト化することも可能です。
このような ed スクリプトがもっとも真価を発揮するのは大量のファイルに変更を加えたい場合です。
たとえば CVS の最初のチェックインに際してすべての C ソースの末尾に $Id$ キーワードなどを挿入するような ed スクリプト(add_cvs_keyword.sh) を作成し、find などと組み合わせると何百とあるソースすべての一括編集が可能となります。
find . -name "*.[ch]" -exec add_cvs_keyword.sh {} \;
他にも html ソース内の用語の一括置換(たとえばメールアドレスや社名の変更)など、いろいろな場面で活用できると思います。ただし、webmaster のみなさん、試す前にバックアップとテストは忘れないでくださいね。:-)



行番号を表示したり見たり数えたりするのは面倒なので、vim であれば「v」で領域を選択してから「:s/^/#/」と入力すればよいのではないかなと (表示上は「:'s/^/#/」になる)。
ちなみに、矩形の選択は「Ctrl+v」です。
投稿: fumiyas | 2006年8月 7日 (月) 12:18
こっちのほうが視覚的でよりわかりやすいですね。:-)
ちなみに私の環境では下のように表示されました。
:'<,'> s/^/#/
これを見るに、vi のマーク機能を自動的に使っているようです。
これと同様の操作を手動で行う場合、領域を開始する行と終了する行にそれぞれマークをつければいいので、
20 行目で
ma
30 行目で
mb
とした後に、
:'a,'bs/^/#/
とすれば同じ動作になります。
ed スクリプト内では不可能ですが、vi(ビジュアル)ならではの領域指定方法ですね。
投稿: kyagi | 2006年8月 7日 (月) 13:15