8

ファイル全体FOOを置き換えたい状況がありました。BARただし、68 ~ 104 行、500 ~ 537 行、1044 ~ 1195 行の間など、特定の場所でのみ実行したいと考えています。ma実際には、関心のある行に ( 、mbmcなどを介して) マーカーをドロップし、次のコマンドを実行しました。

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

これを検索語や置換語などを変えて何十回も繰​​り返さなければならずs/CAT/DOG、そのたびにコマンドラインを書き直すのが面倒でした。検索を限定する必要がある場所が 3 つしかなかったという点で、私は幸運でした (30 または 40 がある場合、コマンド ラインがどれほど混乱するか想像してみてください)。

関数を書く以外に、これを行うためのより良い方法はありますか?

関連メモで。 (検索)レジスタにコピーFOOし、 (置換)にコピーして実行してみましたsBARr

:'a,'b s/\=@s/\=@r/ | 'c,'d s/\=@s/\=@r/ | 'e,'f s/\=@s/\=@r/

これにより、毎回コマンド ラインを書き直す必要がなくなりましたが、残念ながら、うまくいきませんでした。置換ビット \=@rは問題あり \=@sませんでしたが、検索パターンのビットでエラーが発生しました。

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

4

7 に答える 7

5

一連の行ごとの操作 (置換など) をさまざまな範囲の行に対して実行する必要がある場合、使用できるトリックの 1 つは、最初にプレフィックス (どの行とも共有されない) を追加して、それらの行の外観を変えることです。他の行の)。

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

次に:g、 と組み合わせて使用​​し:sます。例えば:

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

最後に、一時的なプレフィックスを削除します。

于 2012-06-22T19:55:28.223 に答える
4

同じ検索パターン、置換文字列、およびフラグを再入力する必要をなくすには、次の :& コマンドを& フラグとともに使用するだけです。

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

(詳細:help :&は を参照してください。)

于 2012-06-23T02:43:43.523 に答える
3

@Vdtの答えに触発されました:

よくわかりませんが、すべての置換をファイルに書き留めて、そのファイルをソースにすると思います。 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して、対応する行ブロックで置換が見つかったことが明らかでない場合は、無視するエラー メッセージを追加できます。

于 2012-06-22T20:11:27.133 に答える
3

マーカーを使用する代わりに、次のものを使用します。

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

これにより、作業が少し簡単かつ明確になります。

于 2012-06-22T19:38:07.997 に答える
2

閉じた折り畳みで実行すると、置換はその折り畳みに制限されます。

  1. 各領域を折ります
  2. 1つの閉じた折り目にカーソルを置きます
  3. 置換を実行します。:s/foo/bar<CR>
  4. zjまたはで次の閉じた折り目に移動しますzk
  5. コマンドライン履歴を使用する::<C-p><CR>または:<Up><CR>同じ置換を実行する
  6. 繰り返す…</li>

置換の最後にフラグを追加してc、Vimが実際に実行する前に確認を求めるようにすることもできます。一致するものがたくさんある場合、これは面倒な場合があります。

于 2012-06-22T22:07:19.097 に答える
2

を使用q:すると、以前のコマンド ラインを呼び出して通常の Vim バッファーとして編集できるため、 と を別のものにすばやく置き換えFOOて、BARでその行を再実行できEnterます。

s/\=@s/\=@r/機能しません。あなたが言ったように、これは交換部品でのみ機能します。ただし、このパターンでは、 ++ を使用Ctrlして、 の代わりにレジスタ s の内容を挿入できR Ctrlます。できればデフォルトのレジスタを使用してください。それは単純ですが、おそらくすでに知っているでしょう。R s\=@ss//

于 2012-06-22T20:03:19.827 に答える
1

これを行う最も簡単な方法は次のとおりです

:5,10s/old/new/g

5,10 : 開始行番号、終了行番号

于 2018-08-30T07:51:05.793 に答える