検索と置換

ヒント31印刷可能なモノブック前へ次へ

2001年作成・複雑さの基本・バージョン6.0

Vimは (置換)検索と置換のコマンド。このヒントは、代替方法の例を示しています。一部のシステムでは、gvimの[編集]メニュー(:help:promptrepl)に[検索と置換]がありますが、コマンドライン履歴と挿入機能があるため、:sコマンドを使用する方が簡単です。検索フィールドまたは置換フィールドへのテキスト(カーソルの下の単語など)。

基本的な検索と置換

:substituteコマンドテキストパターンを検索し、テキスト文字列に置き換えます。多くのオプションがありますが、おそらく次のようなものが必要です。

:s/foo/bar/g「foo」が出現するたびに(現在の行のみ)検索し、「bar」に置き換えます。 “。:%s/foo/bar/g「foo」が出現するたびに(すべての行で)検索し、「bar」に置き換えます。:%s/foo/bar/gc各「foo」を「bar」に変更しますが、最初に確認を求めます。:%s/\<foo\>/bar/gc「foo」に完全に一致する単語全体のみを「bar」に変更します。確認を求めます。:%s/foo/bar/gci各「foo」(iフラグのため大文字と小文字を区別しない)を「bar」に変更します。確認を求めます。:%s/foo\c/bar/gcは、\cで大文字と小文字を区別しないため、同じです。これは、:set noignorecaseを使用して検索で大文字と小文字を区別した後(デフォルト)に必要になる場合があります。:%s/foo/bar/gcI各「foo」(Iフラグにより大文字と小文字が区別されます)を「bar」に変更します。確認を求めます。:%s/foo\C/bar/gcは、\Cで大文字と小文字が区別されるため、同じです。これは、:set ignorecaseを使用して検索で大文字と小文字を区別しないようにした後、必要になる場合があります。

gフラグはグローバルを意味します。つまり、行の最初の出現だけでなく、出現するたびに変更されます。このヒントでは、"gdefault"および"edcompatible"オプション(オフ)のデフォルト設定を想定しています。これには、gフラグを%s///gに含めて、グローバル置換を実行します。 :set gdefaultを使用すると、%s///がグローバルであるのに対し、%s///gはグローバルではないため、混乱が生じます(つまり、 、gはその意味を逆にします。

cフラグを使用する場合は、一致するたびに何を確認する必要があります。やること。 Vimは次のように出力します:replace with foobar (y/n/a/q/l/^E/^Y)?(ここで、foobarは:s/.../.../コマンドの置換部分です。はこの一致を置き換えることを意味し、nはこの一致をスキップし、aはこれと残りのすべての一致を置き換えます( 「残りのすべての」一致)、qはコマンドを終了し、lはこの一致を置き換えて終了します(「最後の」と考えてください)、 ^Eは、Ctrlキーを押しながらEキーを押して画面を上にスクロールし、^Yは、Ctrlキーを押しながら押して画面を下にスクロールします。 Y.ただし、最後の2つの選択肢は、Vimが通常のビルド、大きいビルド、または巨大なビルドであるか、コンパイル時にinsert_expand機能が有効になっている場合にのみ使用できます(出力で+insert_expandを探してください) of :version)。

また、cフラグを使用すると、Vimはtにジャンプします。彼は最初にバッファの先頭から検索した一致を検出し、その一致で置換を実行するための確認を求めます。 VimはIncSearchハイライトグループを一致したテキストに適用して、どの一致が操作されているかを視覚的に示します(reverseに設定)デフォルトでは、Vim7.3以降の3つの用語タイプすべてに適用されます。さらに、複数の一致が見つかり、:set hlsearchで検索ハイライトを有効にしている場合、Vimは残りの一致をSearchハイライトグループでハイライトします。 。検索ハイライトを使用する場合は、これら2つのハイライトグループが視覚的に区別されていることを確認する必要があります。そうしないと、Vimがどの一致に置き換えるように促しているかを簡単に見分けることができません。

詳細

検索範囲:

注:Vim 7.3以降、置換はマークまたは視覚的選択(特殊なタイプのマーク “<を使用)によって定義された範囲に適用されます。および “>)は、デフォルトではマークの列位置に制限されません。代わりに、アトムは、:"<,">s/\%Vfoo/bar/gのようなパターンで使用されます。

検索時:

.*\は/ collectionを指定します。文字範囲は-で表すことができます。たとえば、文字a、b、c、または数字1は、と一致させることができます。を使用してコレクションを否定すると、a、b、c、または1以外のすべての文字に一致します。\{#\}は繰り返しに使用されます。/foo.\{2\}は、fooとそれに続く2つの文字に一致します。\は終了}では必要ないため、/foo.\{2}も同じことを行います。\(foo\)はfooへの後方参照を行います。エスケープのない括弧は文字通り一致します。ここでは、\)を閉じるために\が必要です。

置換する場合:

\rは改行、\nはヌルバイト(0x00)です。\&はアンパサンドです(&は検索パターンに一致するテキストです)。\0はパターン全体に一致するテキストを挿入します\1は最初の後方参照のテキストを挿入します。\2は、2番目の後方参照を挿入します。

他の区切り文字を代わりに使用できます:

:s#http://www.example.com/index.html#http://example.com/#

\zs でパターンの開始と終了を設定します。例:

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/

使用:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

現在の単語を使用またはレジスタ

:%s//bar/g最後の検索パターンの各一致を「bar」に置き換えます。たとえば、最初にカーソルを単語fooに置き、次に*を押してその単語を検索します。上記の代替は、「foo」に完全に一致するすべての単語を「bar」に変更します。:%s/foo/<c-r><c-w>/g「foo」が出現するたびにカーソルの下の単語に置き換えます。<c-r><c-w>は、Ctrl-Rを押してからCtrl-Wを押すことを意味します。カーソルの下の単語は、入力したかのように挿入されます。:%s/foo/<c-r><c-a>/g「foo」が出現するたびにカーソルの下のWORD(空白で区切る)に置き換えます。<c-r><c-a>は、Ctrl-Rを押してからCtrl-Aを押すことを意味します。カーソルの下のWORDは、入力したかのように挿入されます。:%s/foo/<c-r>a/g「foo」が出現するたびにレジスタ「a」の内容に置き換えます。<c-r>aは、Ctrl-Rを押してからaを押すことを意味します。レジスタ「a」の内容は、入力したかのように挿入されます。:%s/foo/<c-r>0/g上記と同じですが、最新のyankコマンドからのテキストを含むレジスタ0を使用します。 yank(コピー)コマンドの例は、カーソルの周りの括弧内のテキストをコピーするyi(、およびカーソルからテキストをコピーするy$です。行の終わりまで。宛先レジスタを指定しなかったyankコマンドの後で、Ctrl-Rを押してから0を押すと、コピーされたテキストを入力できます。:%s/foo/\=@a/g「foo」が出現するたびにレジスタ「a」の内容に置き換えます。\=@aは、レジスタ「a」への参照です。レジスタ「a」の内容はコマンドに表示されません。これは、レジスタに多くのテキスト行が含まれている場合に役立ちます。:%s//<c-r>//g最後の検索パターンの各一致を/レジスタ(最後の検索パターン)に置き換えます。 Ctrl-Rを押してから/を押して最後の検索パターンを挿入した後(Enterキーを押してコマンドを実行する前)、テキストを編集して必要な変更を加えることができます。:%s/<c-r>*/bar/gシステムクリップボード(*レジスタ内)のすべてのテキストを「bar」に置き換えます(複数行の場合は次の例を参照) 。一部のシステムでは、(Vimまたは別のアプリケーションで)テキストを選択するだけで、そのテキストを*レジスタに配置できます。:%s/<c-r>a/bar/gレジスタ「a」内のすべてのテキストを「bar」に置き換えます。<c-r>aは、Ctrl-Rを押してからaを押すことを意味します。レジスタ「a」の内容は、入力したかのように挿入されます。レジスタ「a」の改行は^Mとして挿入され、見つかりません。各^Mを手動で「\ n」(2文字:円記号、「n」)に置き換えると、検索が機能します。この置換は、次のコマンドを入力しているときに実行できます。:%s/<c-r>=substitute(@a,"\n","\\n","g")<CR>/bar/g"\n"(二重引用符)は、1文字の改行を表します。"\\n"(一重引用符)は、2つの円記号の後に「n」が続くことを表します。substitute()関数は、<c-r>=(Ctrl-R=)式レジスタによって評価されます。各改行は、「n」が後に続く1つの円記号に置き換えられます。<CR>は、Enterキーを押して=式を終了することを示します。:%s/<c-r>0/bar/g上記と同じですが、最新のyankコマンドからのテキストを含むレジスタ0を使用します。

クリップボードを使用する代わりに、検索コマンドまたはコロンコマンドでレジスタを貼り付けるを参照してください。

その他の例

:%s/foo/bar/各行で、最初のオカレンスを置き換えます「foo」と「bar」の組み合わせ。:%s/.*\zsfoo/bar/各行で、最後に出現した「foo」を「bar」に置き換えます。:%s/\<foo\>//g各行で、「foo」という単語全体の出現箇所をすべて削除します。:%s/\<foo\>.*//各行で、単語「foo」全体とそれに続くすべてのテキストを(行末まで)削除します。:%s/\<foo\>.\{5}//各行で、単語「foo」全体の最初の出現とそれに続く5文字を削除します。:%s/\<foo\>\zs.*//各行で、「foo」という単語全体に続くすべてのテキストを削除します(行の終わりまで)。:%s/.*\<foo\>//各行で、単語「foo」全体とその前のすべてのテキストを(行の先頭から)削除します。:%s/.*\ze\<foo\>//各行で、単語「foo」全体の前にあるすべてのテキストを(行の先頭から)削除します。:%s/.*\(\<foo\>\).*/\1/各行で、「foo」という単語全体の前後にあるすべてのテキストを削除します。:%s/\<foo\(bar\)\@!/toto/g各行で、「foo」(単語を開始し、「bar」が続かない)の各出現箇所を「toto」に置き換えます。:s/^\(\w\)/\u\1/現在の行の先頭の最初の文字のみが小文字の場合は、\uを使用して大文字に切り替えます(文字の大文字と小文字の切り替えを参照) )。:%s/\(.*\n\)\{5\}/&\r/5行ごとに空白行を挿入します。パターンは、5回繰り返される\(.*\n\)(行末を含む任意の行)を検索します(\{5\})。置換は&(見つかったテキスト)で、その後に\r(改行)が続きます。:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/g検索結果のリストを取得します。 (リストが存在する必要があります)置換のため、modifiedフラグを設定しますが、内容は変更されません。注:最近の十分なVim(バージョン7.3.627以降)を使用すると、これを次のように簡略化できます。:%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gnこれには、バッファーが変更済みとしてマークされないという利点があります。追加の元に戻す状態が作成されます。置換パーツの式はサンドボックスで実行され、バッファを変更することはできません。

特殊なケース

パターンを対応する大文字と小文字を区別するテキストに置き換える場合、Michael Geddes ” ■keepcaseプラグインを使用できます。例:

:%SubstituteCase/\cHello/goodBye/g「HellohellohelLoHELLO」を「GoodbyegoodbyegoodByeGOODBYE」に置き換えます

パッチファイルのオフセットを変更します(ブロックの行番号)、この小さなスニペットを使用できます:

s/^@@ -\(\d\+\),\(\d\+\) +\(\d\+\),\(\d\+\) @@$/\="@@ -".eval(submatch(1)+offsetdiff).",".submatch(2)." +".eval(submatch(3)+offsetdiff).",".submatch(4)." @@"/g

パッチを適用せずに、パッチからいくつかのブロックを削除する場合に便利です。オフセットの違いについて文句を言う。

注式をよりコンパクトにするように努める必要がありますが、不要な行を変更する可能性がない限り、その方法がわかりません。

参照:置換の使用

  • 63ビジュアルブロックへの置換の適用
  • 81文字と行の置換が簡単
  • 159キーストロークの節約置換と検索
  • 406置換の代替区切り文字コマンド
  • 438視覚的な選択で検索して置換
  • 464カーソルの下の単語を検索して置換
  • 479入力せずに置換
  • 573現在のカーソル位置から置換を繰り返す
  • 605単語をヤンクされたテキストに置き換える
  • 654置換コマンドの特殊文字
  • 755での式の使用置換コマンド
  • 808テキストのビジュアルブロックを別のそのようなブロックに置き換えます
  • 915置換の代わりにgを使用します
  • 971増分番号で置換します
  • 1114ステップの増分と置換
  • 1501最後の検索の置換

関連項目:バッファー/ファイルの置換

  • 382検索複数のバッファに置き換えます
  • :help:substitute
  • :help cmdline-rアンジュ
  • :ヘルプパターン
  • :ヘルプ「gdefault」
  • :ヘルプレジスタ

実行する
大きな「関連項目」セクションは、読者に役立つ場合があります。関連するヒントのいくつかをマージする必要があります(ただし、結果を複雑にしすぎないでください)。編集者が追跡できるようにヒント番号を含めました。

簡単な代替が最適であることが多いことを示す短いセクションが必要です。検索してから手動で変更することで処理されます(最後の変更を繰り返すには.を押します)。さらに、各インスタンスを変更する方法を決定できます。nを押して次のインスタンスを検索し、csと入力して検索ヒットを変更できる手法については、検索ヒットのコピーまたは変更を参照してください。

最近、%sの動作に変更がありましたか? どういうわけか、< cr >と\ = @の両方を置換として使用できますが、検索や置換として使用することはできません。

あなたが何をし、何が起こっているのかを正確に説明すれば、質問をしているのを見ても私は助けることができるかもしれません。JohnBeckett(トーク)02:15、2019年6月1日(UTC)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です