web-dev-qa-db-ja.com

正規表現を使用したVim検索

Vimで「abc」で始まり「xyz」で終わる文字列を検索したい。

以下は私が試したコマンドです:

:1,$g/abc[\w\W]*xyz/
:1,$g/abc\[\\w\\W\]\*xyz/
:1,$g/abc*xyz/

「[\ w\W] *」は、「abc」と「xyz」の間のテキストに任意の文字を使用できることを意味します

「1、$」は、検索範囲がvimで開かれたファイルの1行目から最終行までであることを意味します。

検索パターンが見つかりました

abc[\w\W]*xyz 

https://regex101.com/ で動作します

vimで失敗するのはなぜですか?

20
Brian

以下のコマンドは、「任意の文字」がVimとは異なる意味を持たない限り機能します。

:g/abc.*xyz
  • .は、「EOL以外の任意の文字」を意味します。
  • *は、「前のアトムの任意の数(0を含む)」を意味します。
  • 1,$%に短縮できます。
  • :globalはデフォルトでバッファ全体で機能するため、%も必要ありません。
  • /のように:g/patternの後にコマンドが続かない場合は、:g/foo/dを閉じる必要はありません。
20
romainl

ファイルが大きくなりすぎると(たとえば1GB)、「:g/abc。* xyz」は非常に遅くなります。

見つけた

cat fileName | grep abc | grep xyz >> searchResult.txt

vimで検索機能を使用するよりも効率的です。

このメソッドは、「xyz」で始まり「abc」で終わる行を返す場合があることを知っています。

しかし、これは私のファイルではまれなケースであるため(そしておそらく他の人にはあまり起こらないでしょう)、このメソッドをここに書くべきだと思います。

3
Brian

コレクション構文[..]内では、\ w 使用不可 などの文字クラスであるようです。これは、おそらく文字ごとの戦略でテストするためです。 :h /[]から:

テキスト内の各文字をコレクション内の各文字と比較する必要があるため、コレクションとの一致が遅くなる可能性があります。可能であれば、上記の他の原子のいずれかを使用してください。例:「\ d」は「[0-9]」よりはるかに高速で、同じ文字に一致します。

ただし、[..]構文用に特別に用意された同様の機能を使用できます。 :h /[]から再び:

文字クラス式は、その文字クラスに属する文字セットに評価されます。

例は次のとおりです。

[:alnum:]     letters and digits                   
[:alpha:]     letters                              
[:blank:]     space and tab characters             
[:cntrl:]     control characters                   
[:digit:]     decimal digits                       
[:graph:]     printable characters excluding space 
[:lower:]     lowercase letters
0
Yosh

あなたがそれらを一つずつ見つけたいなら、あなたはヒットすることができます

/

そして書く

abc.*xyz

enterキーを押して、パターンの最初の出現箇所を見つけます。次に、nを次の出現に使用し、Shift + n前のもの。私にとっては、これらの行を変更する方が簡単だからです。

0
mcvkr