vimで複数行の文字列を検索して置換する


352

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

vimで選択行から単語を選択して置換するにはどうすればよいですか?

例:から6-10では14-18なく、行からのテキストを置き換えます11-13



回答:


255

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

: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

5
ありがとう。将来のユーザーへの注意- ループ:6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&&も機能し、forループにより覚えやすく、実行しやすくなります。
mu無

5
よろしくお願いします!:あなたには、いくつかのより多くのキーストロークを保存することができますので、後続のコマンドでは、ところで、オプションです。
Ingo Karkat 2013年

2
:&&毎週何百ものキーストロークを節約できます。ありがとう!
pdoherty926

それは私のvimの最後に「g」がなくても機能します。したがって、行の範囲を指定する場合、グローバルフラグは必要ありません
Tayyar R

3
@TayyarR範囲は行をカバーし(いわば垂直方向)、「g」フラグは行内の(つまり水平方向に)一致するものを1つだけまたはすべて一致させるかどうかを決定します。
インゴカーカット

385

すべて置換:

:%s/foo/bar/g

(すべての行で) 'foo'の各オカレンスを見つけ、それを 'bar'に置き換えます。

特定の行の場合:

:6,10s/foo/bar/g

6行目から10行目までのすべての行について、各「foo」を「bar」に変更します。


3
ここで/ gの目的は何ですか?申し訳ありませんが、Linuxは初めてです
Raja Anbazhagan

4
@RajaAnbazhaganこの式の最後の部分は、最後のの後/、操作のフラグを示す場所です。このコマンドは通常、行の最初の一致を置き換えます。gフラグそれはすべての出現を置き換えます。
Litty

17
他の人の作品をコピーして貼り付ける場合は、ソース(つまり、vim.wikia.com / wiki / Search_and_replace)を実際に参照する必要があります。
Andrew S

2
%事は仕事をしません!それ以外の場合は、最初の発生のみです。
Santosh Kumar

7
%=>すべての行でこのコマンドを実行します。g=>同じ行の複数の出現に一致します。
shaahiin

55

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

  • 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モードでは特別な行番号.を使用できます。これは単に現在の行を意味します。したがって、次のように現在の行でのみ検索/置換できます。

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

もう1つ注意すべき点は:、範囲と検索/置換コマンドの間に秒を挿入しても害はありません。つまり、これらのコマンドは引き続き機能します。

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

1
>例:行6-10、14-18のテキストを置き換えますが、11-13のテキストは置き換えません。—あなたの返事はまさにこの質問に答えませんか?
ポジェ16

27

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

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

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


20

vimで影響を受けるすべての行が混乱している場合は、以下を使用してください

 :%s/foo/bar/gc  

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

:wq

1
c範囲を指定することに加えて、実際にフラグを使用できるため、:6,10s/<search_string>/<replace_string>/c機能します。cの略ですconfirmcフラグが頻繁に使用されているのは、そこに存在するとは思わなかった単語を誤って置き換えてしまうのを防ぐためです。
Wolfson

16

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

「foo」という単語を見つけて、「bar」に置き換えたいとします。

最初のヒット[Esc]キー

タイプ:(コロン)の後に%s/foo/bar/[Enter]キーを押します

:%s/foo/bar/


11
あなたの:%s/<search_string>/<replace_string>/gコマンドでは、ファイル全体のすべての出現を置き換えます。質問への正確な答えではありませんが、それでも有用です:)
tanius

@tanius実際、それは私の問題に対する最も簡単な答えでした。質問を「選択した行のvimで文字列を検索して置換する」に変更することを検討できます
Omid N

9

現在の行番号を入力する必要はありません。

あなたは、それぞれを変更したい場合fooにはbar(現在の行のための.)と2つの次の行(+2)、単純に実行します。

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

あなたは変更が行われる前に確認したい場合は、交換するggc

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

私がよく使用するもう1つの良い点は:.,$s/foo/bar/gc、現在の行からファイルの最後まで検索して置換することです。
Wolfson

3

検索と置換

:%s/search\|search2\|search3/replace/gci

g =>グローバル検索

c =>最初に確認を求める

i =>大文字と小文字を区別しません

確認なしで直接交換したい場合は、以下のコマンドを使用してください

:%s/search/replace/g

各置換の確認が必要な場合は、以下のコマンドを実行します

:%s/search/replace/gc

最初に確認を求めます。ここでの検索では大文字と小文字が区別されません。

:%s/search/replace/gci

1

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

残念ながら、これは標準の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

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

悪い点は、演算子を後で適用するためにテキストを選択するよりも簡単ではないことです。良い点は、これが他の同様のテキスト範囲(この場合は段落)の範囲の挿入を視覚的に異なるサイズで繰り返すことができることです。つまり、後で範囲の大きい段落「。」を選択する場合。それは正しいでしょう。

また、セマンティックテキストオブジェクトを使用して操作の範囲を選択するという考えが好きな場合は、同じことをより簡単に実行できるプラグインEXtend.vimを確認 できます。


0

この質問に答えるには:

:40,50s/foo/bar/g

40行目から50行目までの行で、これらの行のfooをbarに置き換えます。このコマンドを実行すると、現在任意の行に配置できます。

:50,40s/foo/bar/g

また、vimは確認を求め、最初のコマンドを入力した場合と同じように置き換えを行います。

:,50s/foo/bar/g

現在いる行と50行目(両端を含む)の間のこれらの行で、fooをbarに置き換えます。(50行目以降の行にいる場合、vimは再度確認を求めます)

vimとEclipseのvrapperプラグインの違いを明確にするために:

varpperでは

:,50s/foo/bar/g コマンドは機能しません。

:50,40s/foo/bar/g 確認を求めずに動作します。

(Vrapperバージョン0.74.0以前の場合)。


-5
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal

上記を他の情報で置き換えたいとしましょう。

COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)

この場合、上記は(sys.pkg.mpu.umc.kdk.)に置き換えられます。


これが実際に質問に答えているかどうかはわかりません。質問から、尋ねる人は%s入力を変更する方法をすでに知っていますが、「セミグローバル」に行う方法を知りたいようです(つまり、彼の仕様は6-10行目と14-18行目ですが、11行目ではありません- 13)。
Brandon Buck

1
「コマンド」とは?そして、あなたは傾いたつまようじ症候群に苦しんでます。
Martin Tournoij、2016

その症候群を治すために、あなたの代わりに、デフォルトの区切り文字として他の文字を使用することができ/、例えば!@_:%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g
MortezaE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.