特定の行のvimで検索して置換


94

使うことができます

:5,12s/foo/bar/g

5行目と12行目の間で検索しfooて置き換えるbarにはどうすればよいですか?5行目と12行目だけで(その間の行ではなく)それを行うにはどうすればよいですか?

回答:


75

Vimには、特定の行や列などで一致する特別な正規表現アトムがあります。それらを(おそらく範囲に加えて)使用して、一致を制限することができます。

:5,12s/\(\%5l\|\%12l\)foo/bar/g

見る :help /\%l


8
予想よりも複雑な方法ですが、私の質問に完全に答えます。ありがとう!
pfnuesel 2013年

55

5行目で置換を実行し、12行目で最小限の労力でそれを繰り返すことができます。

:5s/foo/bar
:12&

インゴが指摘したように、:&あなたの旗を忘れています。を使用している/gので、正しいコマンドは次のようになります:&&

:5s/foo/bar/g
:12&&

:help :&と友達を参照してください。


10
あいまいなもの:&を使用するための+1 。フラグ(s/../../g)がある場合は、使用する必要:&&がありますが...
Ingo Karkat 2013年

10
@IngoKarkat、公平を期すために、私\(\%5l\|\%12l\)はより曖昧だと思います:&
doubleDown 2013年

13

いつでもc最後にを追加できます。これにより、すべての試合の確認が求められます。

:5,12s/foo/bar/gc

1
5行目と12行目の間に多くの試合がある場合、これは悪夢になる可能性があります(gフラグが使用されていることに注意してください)
doubleDown 2013年

1
@doubleDownこれは(可能な候補が多数ある)普遍的な解決策を意味するものではありませんが、ほとんどの場合n、5〜6回押すこと\(\%5l\|\%12l\)は、代替ステートメントに追加するよりも面倒です。
ディーン

これは便利だと思います。1行おきに変更したかったのですが、これは最終的に行ったよりも高速でした。
tiktak 2017年

9

興味深い質問です。範囲の選択のみがあり、複数行の選択はないようです。

http://vim.wikia.com/wiki/Ranges

ただし、5行目と12行目に何か特別なものがある場合は、:g演算子を使用できます。ファイルが次のようになっている場合(参照用の番号のみ):

 1     line one
 2     line one
 3     line one
 4     line one
 5     enil one
 6     line one
 7     line one
 8     line one
 9     line one
10     line one
11     line one
12     enil one

そして、あなたが交換したいoneenoありますラインのenil代わりにline

:g/enil/s/one/eno/

5
これは実際には多くのことを
doubleDown 2013年

1

edviやvimと同様のコマンドを備えた行指向のテキストエディタを使用できます。それはおそらくviとvimよりも前のものです。

スクリプト(EndCommandマーカーまで入力を処理するヒアドキュメントを使用)では、次のようになります。

ed file <<EndCommands
    5
    s/foo/bar/g
    7
    s/foo/bar/g
    wq
EndCommands

もちろん、edコマンドはコマンドラインでも使用できます。


3
vim代替案に勝る利点は見当たりません。
Bernhard

1
そして、Vimでも同じことができます。数字は実際にはの前に置くことができますが:s、それでも:sコマンドの重複があります(romainlのソリューションはこれを回避します)。
Ingo Karkat 2013年

私の見解では、ユーザーは編集のために2行以上を大量に選択したいと思うかもしれません。その場合、非対話型のアプローチが興味深い可能性があります。これは、vimではAFAIKでは実行できません。
suspectus 2013年

1
ああ、Vimはそれを行うことができます(たとえば「Ex」モードで)が、インタラクティブエディタよりも別のツールを優先する必要があるのは正しいです。sedしかし、私の好みは...
Ingo Karkat 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.