viモードのコマンドライン:すべて置換

viモードのコマンドライン:すべて置換

viモードのコマンドラインでグローバル置換を実行する方法プレフィックスを追加してexコマンドを使用できないようですが、どうすればよいですか:

たとえば、コマンドのすべての内容を次のように置き換えるには\.../

答え1

私は使用しますバッシュ履歴メカニズム:

$ echo 'foo\bar\baz'
foo\bar\baz
$ !!:gs/b/B/
echo 'foo\Bar\Baz'
foo\Bar\Baz

しかし、バックスラッシュを次に置き換えることはできないようです。

$ echo 'foo\bar\baz'
foo\bar\baz
$ !!:gs/\\/\//
bash: :gs/\\/\//: substitution failed

答え2

viコマンドモード時

:1,$s+\\+/+g

これにより、すべてのバックスラッシュ文字がスラッシュに置き換えられます。

答え3

viこれを行う方法はいくつかあります。スピーチみんなex行(「:」行)には、%またはを使用できます1,$。同様に、それは他のものを許可します区切り記号for s(代替コマンド).したがって、次のように変更できます。

:%s/\\/\//g
:%s,\\,/,g
:1,$s/\\/\//g
:1,$s,\\,/,g

ポイントは

  • バックスラッシュ置換に使用する正規表現の文字で、次のようにする必要があります。脱出するそれを使って、
  • 区切り記号は句読点でなければなりません。
  • 最後に、(最初と3番目の例では)次のものを使用できます。区切り記号前後の文字列の一部として使用されますが、この場合もエスケープする必要があります。

答え4

vi内で\を/にグローバルに置き換えるのに問題がある場合、最初の文字は特殊文字なのでエスケープする必要があり、2番目の文字は通常sed区切り文字で選択されるため、やはりエスケープする必要があるからです。あなたはそれを使用することができます:

:%!tr '\\' '/'

または

:%s,\\,/,g

または

:%s/\\/\//g

完全性のためにマクロなしで通常のviを使用し、exモードを無効にするには、次の手順を実行する必要があります。

/\\
r/nr/nr/nr/nr/nr/nr/nr/nr/nr/nr/n

最後の手順を好きなだけ繰り返します。フロントモードを使用したくない場合は、どうすればよいかを示すために含めただけです。

関連情報