OpenWindows ユーザーズガイド (上級編)

vi による検索と置換

vi には指定された文字列をファイル内で検索するための方法がいくつかあります。また、広範囲にわたった置換機能も利用できます。

文字列の検索

文字列とは、1 つ以上の文字の配列です。文字列には、英字、数字、句読点、特殊文字、空白、タブ、改行を入れることができます。文字列は、文法的に正しいワード、ワードの一部だけのどちらでもかまいません。

文字列を検索するには、/ の後に検索する文字列を入力して Return キーを押します。カーソルがある位置から検索を始め、その文字列の先頭位置にカーソルが移動します。たとえば meta という文字列を検索する場合は、/meta と入力して Return キーを押します。

それと同じ文字列をさらに検索するには、n を押します。カーソル位置よりも前 (逆) 方向に検索するには、N を押します。

ファイル内で逆方向 (画面の上の方向) に文字列を検索する場合は、/ の代わりに ? を使います。その場合、nN では / の時と方向が逆になります。

通常の検索では大文字と小文字が区別されます。したがって、china の検索では China は見つかりません。検索時に大文字と小文字の区別を無視させる場合は、:set ic と入力します。デフォルトの検索モードに戻すには、:set noic と入力します。

検索する文字列が見つかると、最初の出現位置にカーソルが移動します。文字列が見つからない場合は、状態表示行に「パターンが見つかりません」というメッセージが表示されます。

特殊文字 ( / & ! . ^ * $ ¥ ? ) は検索機能にとって特別な意味を持っているため、検索対象の文字列中で使う場合は「エスケープ」する必要があります。特殊文字をエスケープするには、その文字の前にバックスラッシュ (¥) を付けます。たとえば anything? という文字列を検索する場合は、 /anything¥? と入力して Return キーを押します。

これらの特殊文字は、検索機能に対するコマンドとして使えます。したがって、これらの文字を 1 つ以上含む文字列を検索する場合は、その文字の前にバックスラッシュを付けてコマンドではないことを示す必要があります。バックスラッシュ自身をエスケープするには、¥¥ と入力します。

高度な検索

次の特性を表すタグを文字列に付けることによって、さらに高度な検索ができます。

行の先頭を表すには、検索文字列の最初にキャレット (^) を付けます。たとえば、Search で始まる行を検索する場合は、次のように入力します。

/^Search

行の終わりを表すには、検索文字列の最後にドル記号 ($) を付けます。たとえば、search. で終わる行を検索する場合は、次のように入力します。(ピリオドをバックスラッシュでエスケープしていることに注意してください。)

/search¥.$

ワードの先頭を表すには文字列の最初に ¥< を付け、ワードの終わりを表すには文字列の最後に ¥> を付けます。したがって、文字列ではなくワードを検索する場合は、ワードの先頭を表すタグとワードの終わりを表すタグを検索パターン中で組み合わせて使います。たとえば、search というワード (文字列中にあるものは除く) の出現位置を検索するには、次のように入力します。

/¥<search¥>

任意の 1 文字を表すには、文字列中のその文字の位置にピリオド (.) を入力します。たとえば、disinformation または misinformation の出現位置を検索するには、次のように入力します。

/.isinformation

この検索はワードではなく文字列を対象としているため、上記の検索パターンは misinformationalist や disinformationism という構文とも一致します。

指定した文字のどれかと一致する文字を検索するには、それらの文字を括弧 [] で囲みます。たとえば、/[md]string という検索パターンは、m または d で始まる文字列と一致します。また、/[d-m]string という検索パターンは、d から m のうちの 1 文字で始まる文字列と一致します。

文字列中にアスタリスク (*) を使うと、* の直前の文字のゼロ個以上の繰り返しを表すことができます。括弧 []* を効果的に組み合わせると、検索する文字列を細かく指定できます。たとえば、次の例のように入力すると、文字列 isinformation が出現する位置、および a から z のうちの 1 文字で始まり文字列 isinformation で終わる文字列が出現する位置をすべて検索します。

/[a-z]*isinformation

文字列の置換

以降で使われる文字列を置換する手順は、上記で説明した検索手順に基づいています。検索パターンを表す特殊文字は、検索および置換の手順でもすべて同様に使えます。

置換コマンドの基本形式は次のとおりです。

:g/search-string/s//replace-string/g

上記のコマンドを入力した後に Return キーを押します。

たとえば、disinformation という文字列をすべて newspeak で置換するには、次のように入力して Return キーを押します。

:g/disinformation/s//newspeak/g

このコマンドで、文字列が見つかるたびに検索を中断して置換を行うかどうかを確認するメッセージを出させることもできます。次のコマンド例では、gc (「consult」を表す cg に追加したもの) を使って、disinformation が見つかるたびに検索を中断して置換を行うかどうかを確認するメッセージを出すよう設定しています。置換する場合は y、置換しない場合は n を入力してから Return キーを押します。

:g/disinformation/s//newspeak/gc


注 -

この応答形式の検索と置換を中断するには、Ctrl-C を押します。Ctrl-C の入力以前に y と入力されたものに関しては、置換されたままとなります。


指定行へジャンプする

編集ファイルの最終行にジャンプするには、G を押します。ファイルの先頭行に戻るには、1G と続けて押します。

行番号の数字を押した後で G と押せば、指定した行にジャンプできます。

たとえば、あるファイルの 51 行目を編集してから vi を終了したとします。その後、 51 行目からまた編集したい場合は、vi でそのファイルを開いてから 51G と続けて押してください。その 51 行目にカーソルが移動し、その行から編集を始めることができます。