行の最後の一致でのみ動作するようにできますか?


16

:s/pattern/replacement最初の一致と:s/pattern/replacement/gすべてで動作し ます。

最後の1つだけで操作する方法は?

回答:


18

私は使うだろう \zs

:%s/.*\zspattern/replacement/

ちょっとした説明:

  • . 任意の単一の文字を表します
  • * 貪欲なマッチング(可能な限り)を表します

Vimのでは、ゼロ幅のアンカーを使用することができます\zsし、\zeスタートとあなたが一致したい検索パターンの終了を定義します。パターン内の前後は\zs\ze置換による影響を受けません。

わかりやすくするために、wikiaSearch and replaceのこの例を使用します。

パターンの開始と終了を設定するためにとを使用して\zs、入力を保存します\ze。たとえば、次の代わりに:

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/ 

使用する:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

詳細については、


\zsあなたの答えには何の基本的な説明がありますか?
EvergreenTree

3
これは、ことは注目に値します理由ので、この作品が.*ある貪欲
ワイルドカード

7

すべてをグループ化することで、最後の一致を検索できます\(.*\)が、最後の出現はpatternです。次に、キャプチャされたグループで終了し\1、を追加しreplacementます。

:%s/\(.*\)pattern/\1replacement/

(これは@ryuichiroの\zsソリューションより劣ります\1。機能的には同等ですが、より冗長です(一方、特に他の正規表現フレーバーに使用される場合は覚えやすいかもしれません))
アーロントーマ

0

完全を期すために、私は代替案を投稿すると思いました。Vimには複数のアイテムがあり、そのいくつかは、より標準的な正規表現の先読みアサーション(ネガティブ/ポジティブルックアヘッド/ルックビハインド)に似ています。/programming/2973436/regex-lookahead-lookbehind-and-atomic-groups

この場合、負の先読みが\@!必要です。つまり、アイテムの前にあるアトムpatternの後に出現しないことをアサートすることを意味します。この場合、アトムは他の何かが先行するパターン自体です。

:%s/pattern\(.*pattern\)\@!/replacement/

括弧内の部分はゼロであり、一致に含まれないため、置換によって置き換えられません。

:h \@!詳細または:h pattern-multi-itemsその他のルックアラウンドバリエーションを含むセクション全体について。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.