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

答え2

このコマンドを見つけたサイトがvi間違っています。

可能1996年のそのウェブサイトまたは、二重チェックなしでこの行をコピー/貼り付けた他の多くの人の1つです。

Using vi, the Unix Visual Editor


:.,$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

© Copyright 1996 University of Washington Computing & Communications.

作成すべき内容は次のとおりです。

:1,.s/old/new/g

キャレットは以下のさまざまな方法で使用できますvi。そのうちの1つがその領域に線の始まりをパターンに伝えるものであるため、線を始める/^old/ときに「古い」を意味すると、「行の終わり」を意味するときは「古い」を意味します。$/old$/

私はこの対称性のために混乱が発生すると確信しています。著者(Rick Ells)は、キャレットが^ファイルの終わりまたは行の終わりを意味するだけに、ファイルの$始まりまたは行の始まりを意味すると思いますが、そうではありません。

Kusalanandaが指摘したように、キャレットが住所として使用されるときに具体的で異なる意味を持つこともありますが、IMHOは-1より直感的なこのショートカットを使用している人を見たことがないので、これは逸話です。

関連情報