viエディタで置き換えるには、キャレット(^)を使用してください。

viエディタで置き換えるには、キャレット(^)を使用してください。

s///私はCentOSを使用しており、私のエディタでコマンドを置き換える方法について読んでいますvi。私が見たいくつかの例をテストしたいと思います。

:%s/old/new/g     Substitutes old with new throughout the file
:.,$s/old/new/g   Substitutes old with new from the current cursor position to the end of the file

上記の例は期待どおりに機能しますが、^キャレット()を含む次の例は機能しません。

 :^,.s/old/new/g   Substitutes old with new from the beginning of the file to the current cursor position

試してみましたが、ダメでカラットが食べられないのでしょうか、それとも命令を間違って入力したのでしょうか?

ベストアンサー1

エディタviexアドレスed(BSDシステムと同様)^は前の行です。これは、コマンドが^d前の行を削除し、この行を前の行と置き換え、^m.前の行とこの行に^,.s/old/new/g一致するすべての文字列を置き換えることを意味します。oldnew

エディタは元のエディタの拡張された再実装でvim、通常Linuxシステムに、およびという名前でインストールされます。このエディタは、前の行をこのように処理せずに「」と応答します。viexvimviexE492:編集コマンドではありません。"を使用しようとすると、orの-代わり-1に次のものを使用できます。

-,.s/old/new/g

使用-または-1交換は、非GNUシステム^にも適用されます。edexvi

POSIX規格次のように教えてくださいed編集者に関してこの点について:

歴史的に、文字は住所としてed許可されており、^この場合は<hyphen-minus>文字と同じでした。 POSIX.1-2017では、この動作を要求または禁止しません。

一つある同様の表現viexエディタ(「ラインエディタモード」)の場合exvi

歴史的に、exこのvi文字^はアドレスとコマンドのフラグオフセットとして許可されました。どちらの場合も-キャラクターと同じです。 POSIX.1-2017では、この動作を要求または禁止しません。

引用しているテキストは、^,.ファイルの先頭から現在の行までのすべての行を指定するという意味です。これは正確ではありません。前および現在の行のみを処理し、および(viおよびexedの「歴史的に正確な」実装でのみ処理します。編集バッファの先頭から現在の行まで、すべての行のアドレスを指定するには、を使用します1,.

^-instead-of-スペルエラー1は、おそらく「$編集バッファの最後の行アドレスでもある正規表現の行末アンカーが正規表現なので、^対称的に)BE最初バッファラインの編集」。

別の常識を提供すると、この^アドレスはエディタのGNU実装では使用できませんed。の他の実装と同じか、edそれでも代替として使用できます。--1

おすすめ記事