2012-06-22 16 views
8

私はFOOをBARに置き換えたいという状況がありました。しかし、私は68〜104行、500〜527行、1044〜1195行のように特定の場所でのみ行いたいと思っています。Vimの検索と置き換え - 特定の行に限定する

:'a,'b s/FOO/BAR/g | 'c,'d s/FOO/BAR/g | 'e,'f s/FOO/BAR/g 

私は別の検索で何度、この数十を繰り返し、用語秒を交換しなければならなかった:実際に私は興味のラインでマーカー(MA、MB、MC、...)を滴下し、私は次のよう走りました/ CAT/DOGなどになり、毎回コマンドラインを書き直さなければならなくなってしまった。私は自分の検索範囲を制限したいと思う場所が3つしかなかったので運が良かったです(30または40の場合、コマンドラインがいかに乱雑になるか想像してください)。

関数を書くのは簡単ではありませんが、これを行うためのより純粋な方法がありますか?

関連するメモにあります。私は「S」(検索)にFOOをコピーし登録して、「R」にBAR(置き換え)とこれは私がそれぞれ再書き込みコマンドラインを有する保存しているだろう

:'a,'b s/\[email protected]/\[email protected]/ | 'c,'d s/\[email protected]/\[email protected]/ | 'e,'f s/\[email protected]/\[email protected]/ 

のコマンドラインを試してみました時間が、それはうまくいきませんでした。置き換えビットは\ r @がうまくいっていましたが、検索パターンの\ = @がエラーを出しました。

ヒントをいただければ幸いです。

+0

また、CONTROL-PとCONTROLを使用することができます-N(私は思う)は前のコマンドを繰り返しています。これにより、コマンドを再入力する必要がなくなります。 – jahroy

+0

それが役に立つのであれば、答えを受け入れるのが普通です。 – epsilonhalbe

答えて

2

代わりのマーカーの使用にこのいずれかを使用:

:68,104s/FOO/BAR/g << substitue from line 68 to 104

これはあなたの仕事を少し簡単にし、より明確にすべきです。

5

異なる範囲の線の範囲で線のような操作(置換など)を実行する必要がある場合は、最初に接頭辞(つまり、 tは他の行のいずれかによって共有されます)。

私が通常行う方法は、最初の行に>Gのようなファイルをインデントしてから、:s/^ /X/コマンドまたはブロックビジュアルのいずれかを使用して、必要な行の先頭のスペースをXに置き換えます。

:sと組み合わせて:gを使用してください。例:

:%g/^X/s/FOO/BAR/g 
:%g/^X/s/BAZ/QUUX/g 

最後に、仮接頭辞を削除します。 q:

+0

私は自分の範囲内の各行の最初の列に一時的な印を付けています。それは素晴らしい考えです。 (残念なことに、テキストファイルがソースコードであったため、この場合はうまくいきませんでした。 –

+1

コード行を区別するために、すべての行にコメントを付けることができましたが、コンパイルで。 – epsilonhalbe

2

、あなたはすぐに何か他のものとFOOBARを置き換えることができますので、その後、再実行持つ行がを入力し、前のコマンドラインを呼び出すと、通常のVimのバッファとしてそれらを編集することができます。

s/\[email protected]/\[email protected]/は機能しません。あなたが言ったように、これは交換部品でのみ機能します。しかし、パターンのために、あなたの代わりに\[email protected]の、レジスタSの内容を挿入するはCtrl +RはCtrl +RSを使用することができます。好ましくはデフォルトのレジスタを使用してください。それで簡単なのはs//ですが、おそらくそれはすでに分かっているでしょう。VDTの答え@触発さ

+0

_q:_とは何ですか? – jahroy

+0

ああ!私はq:コマンドを知らなかった - 素敵! –

3

私はわからないが、あなたは、私が思うファイルのファイルとソース内のすべての置換を下に書くことができます。 substitutions.vim

68,104s/FOO/BAR/g 
168,204s/FOO/BAR/g 
618,644s/FOO/BAR/g 
681,1014s/FOO/BAR/g 
. 
. 
. 
68,104s/BAZ/BOOO/g 
168,204s/BAZ/BOOO/g 

、その後:so substitutions.vim多分あなたも同じ構造の複数のファイルのためにこれを使用することができます。 eを追加して、対応する行ブロックで置換が見つかったことが明確でない場合は、無視エラーメッセージを追加することができます。

+0

はい、それもうまくいきました。私は 'e'フラグを知らなかった - ありがとう。 –

+0

「e」の場合、私は小道具をhttp://stackoverflow.com/questions/11146763/about-a-key-binding-to-remove-trailing-spaces-and-save/11146887#11146887に付ける必要があります。 @ pb2q – epsilonhalbe

+0

ps私はテストファイルでこれを試したところ、魅力的なように機能します。ありがとうございました。 –

2

閉鎖された折り畳みにわたって実施される場合、置換はその折り畳みに限定される。

  1. 各地域を折るには、1の上にカーソルを置く
  2. 置換を行い倍閉じ:次へ:s/foo/bar<CR>
  3. 動きがzjまたはzk
  4. コマンドライン履歴を使用すると倍閉じました: :<C-p><CR>または:<Up><CR>同じ置換を実行する
  5. リピート...

置換の最後にcフラグを追加して、Vimが実際に実行する前に確認を求めるようにすることもできます。多くの試合がある場合、これは面倒な作業です。検索パターンを再入力する必要を取り除くために

4

、置換 文字列とフラグ、1は単に&フラグ付き:&コマンドを使用することができますが:

:'a,'bs/pat/str/g|'c,'d&&|'e,'f&& 
+0

:&私の新しいものです。ありがとう、それは非常に便利になるでしょう。 –

+0

@Dave:それは確かに便利です。私が質問を正しく理解していれば、 ':&'コマンドを使って問題を解決するのですか? –

+0

私が与えた例では、はい、それは完璧なおかげです。しかし、私が検索したい場所がたくさんある場合は、@ eipson-2-halbeの答えがより現実的かもしれないと思います。私が40の場所を持っていたとしたら、外部テキストファイルをソーシングすると、コマンドラインに40 'xxx、' yyy &&のエントリを置くほうが扱いやすいかもしれません。あなたの方法の両方の組み合わせは、おそらく行く方法です! –

関連する問題