web-dev-qa-db-ja.com

複数行でvimの文字列を見つけて置き換える

ファイル全体の文字列を置き換えるために:%s/<search_string>/<replace_string>/gを、現在の行で置き換えるために:s/<search_string>/<replace_string>/を行うことができます。

どうやってvimの選択行から単語を選択して置き換えることができますか?

例:6-1014-18の行のテキストを置き換えますが、11-13の行のテキストは置き換えないでください。

262
mu 無

:&&コマンドは、同じフラグを使用して最後の置換を繰り返します。追加の範囲をそれに与えることができます(そしてあなたが好きなだけ連結することができます):

:6,10s/<search_string>/<replace_string>/g | 14,18&&

たくさんの範囲 /があるのであれば、私はループを使いたいと思います。

:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor
204
Ingo Karkat

すべて置換:

:%s/foo/bar/g

(すべての行で) 'foo'の出現箇所をそれぞれ見つけて、それを 'bar'に置き換えます。

特定の行の場合:

:6,10s/foo/bar/g

6行目から10行目までのすべての行について、それぞれの 'foo'を 'bar'に変更します。

276

補足として、行番号を入力する代わりに、視覚モードのいずれかで検索/置換する行を強調表示するだけです。

  • VISUALモード(V
  • VISUAL BLOCKモード(Ctrl+V
  • VISUAL LINEモード(Shift+V、あなたの場合に最適です)

置換する行を選択したら、コマンドを入力します。

:s/<search_string>/<replace_string>/g

範囲'<,'>が自動的に挿入されることに注意してください。

:'<,'>s/<search_string>/<replace_string>/g

ここで'<は、単に最初に強調表示された行を意味し、'>最後に強調表示された行を意味します。

NORMALモードの場合、動作は予期しないものになる可能性があることに注意してください:'<および'>は、VISUALモード。代わりに、NORMALモードでは、特別な行番号.を使用できます。これは、単にcurrent lineを意味します。したがって、次のように現在の行でのみ検索/置換できます。

:.s/<search_string>/<replace_string>/g

もう1つ注意すべきことは、範囲とfind/replaceコマンドの間に2番目の:を挿入しても害がないことです。つまり、これらのコマンドは引き続き機能します。

:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g
47
Attila O.

あなたは2つの検索/置換シーケンスでそれをすることができます

  :6,10s/<search_string>/<replace_string>/g
  :14,18s/<search_string>/<replace_string>/g

2回目に調整する必要があるのは範囲だけなので、すべて入力するのではなく、最後のコマンドを思い出して範囲だけを編集します。

27

VI検索と置換コマンドの例

“ foo”という単語を見つけて“ bar”に置き換えたいとしましょう。

最初のヒット[Esc]キー

(コロン)に続けて%s/foo/bar/を入力し、[Enter]キーを押します。

:%s/foo/bar/

12
arnav

どの行が影響を受けるか混乱しているならvimで、以下を使ってください。

 :%s/foo/bar/gc  

各「foo」を「bar」に変更しますが、最初に確認を求めます。はいの場合は「y」、いいえの場合は「n」を押してください。その後保存することを忘れないでください

:wq
10
SMJ

現在の行番号を入力する手間が省けます。

現在の行(.)と次の2行(+2)の各foobarに変更したい場合は、単に以下のようにします。

:.,+2s/foo/bar/g

変更を加える前に確認したい場合は、ggcに置き換えます。

:.,+2s/foo/bar/gc
5
andykong10

視覚的な選択で範囲を指定することは問題ありませんが、オペレータが選択できる2〜3行で非常に単純な操作がある場合は、これらのコマンドをオペレータとして適用するのが最善です。

残念ながら、これは標準のvimコマンドでは実行できません。 !を使用してある種の回避策を実行できます。 (フィルタ)演算子と任意のテキストオブジェクト。たとえば、段落に操作を適用するには、次のようにします。

!ip

これは「演算子を適用する!段落の中」と読み替えてください。フィルタ演算子はコマンドモードを開始し、自動的に行の範囲とそれに続くリテラル "!"を挿入しますその直後に削除できます。これを適用すると、次の段落に適用されます。

1
2  Repellendus qui velit vel ullam!
3  ipsam sint modi! velit ipsam sint
4  modi! Debitis dolorum distinctio
5  mollitia vel ullam! Repellendus qui
6  Debitis dolorum distinctio mollitia
7  vel ullam! ipsam
8
9  More text around here

"!ap"を押した後の結果は次のようになります。

:.,.+5

「。」として(point)は現在の行を意味し、現在の行とその後の5行の間の範囲が操作に使用されます。これで、以前と同じ方法で代替コマンドを追加できます。

悪い部分は、これが後者を演算子に適用するためのテキストの選択よりも簡単ではないということです。良い部分は、これが、見た目の大きさが異なる他の同様のテキスト範囲(この場合は段落)に対して範囲の挿入を繰り返すことができるということです。つまり、後でより大きな範囲の段落「。」を選択する場合は、それを正しくします。

また、セマンティックテキストオブジェクトを使って操作範囲を選択するというアイデアが好きなら、私のプラグイン EXtend.vim をチェックすることで同じことができますが、もっと簡単です。