vim: 最短一致
ed/ex/vi/vimの検索は、基本「最長一致」である.
その行内で一番遠い場所で一致したものを優先する.
* はなんでもありの最長一致コマンド.
※例えば,"aaa,bbb,ccc"があった時,/.*, だと一番遠いカンマまで,つまり"aaa,bbb," がヒットする.
しかし近い場所からの一致がしたい場合がある.
※上の例だと"aaa,"にヒットさせたい場合とか.
★解: \{-} で、最短一致できる.
左側の{はエスケープするため\が必要.
※上の例だと,"*"の代わりに"\{-}"を使う.つまり
/.\{-}, → で,"aaa,"にヒットする.
★使用例: 行頭から最短の xxx を探索する.
/^.\{-}xxx
◆入力が結構面倒なので,mapでシンプルに.
.vimrc に,以下を記入.
nnoremap ,/ /^.\{-}
1. 文中で ",/" と打鍵 → 最短一致の表記が自動入力
2. 探したい文字を入れてEnter
※ ",/" は自分のvimに都合のよいように変えよう
◆置換 s コマンドでは一般の正規表現の "?" を使う
sコマンドはsedでも使うが,最短一致には,{-} ではなく,? を使う.
使い方は検索後の最後に \? をつける.エスケープするのがコツ.例えば……
code: 例:
$ cat hoge
aaa 1 aaa 2 aaa 3 aaa
↑↑↑これをbbbにしたい
↑↑ この1行だけのファイル hoge に対し,左端の"aaa"――1の左側――を"bbb"に置換したいとする.
sedを使うと, ↓↓ のようになる.
code:sedで最短一致のaaaをbbbに
$ sed -e 's/aaa\?/bbb/' hoge
bbb 1 aaa 2 aaa 3 aaa
↑↑↑最初のaaaが置換されている