質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

Q&A

解決済

2回答

8201閲覧

vimgrep で完全一致の正規表現の記述を教えてください。

eisaku123

総合スコア74

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

0グッド

0クリップ

投稿2017/08/16 14:19

いつもお世話になります。
表題の通り、vimgrep で完全一致の正規表現の記述方法がわかりません。

ネットいろいろ探しましたが、みつからなくて困ってます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mattn

2017/08/16 14:29

どういう意味で完全一致と言っておられるのか分かりません。書いた正規表現が1行として完全一致という意味ですか?それとも書いたパターン(たとえばドットがドットとしてマッチする)がそもままマッチするという意味での完全一致ですか?前者であればネットで検索すればすぐに見つかります。前の質問もそうでしたが、質問が少し雑すぎます。
eisaku123

2017/08/16 14:46

例えばerror と error123 があったら、最初のerrorだけが検索される方法を完全一致としてます。
guest

回答2

0

ベストアンサー

:vimgrep /\<error\>/ *

で言っておられる結果が得られるかと思います。

投稿2017/08/16 15:58

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshitia

2017/08/16 16:23

単語の境界にマッチ、これですね。 ありがとうございます。 なかなか思い出せませんでしたorz
eisaku123

2017/08/17 00:35

ありがとうございます。できました。 しかしこの表現で  /\<error\>/  何でできるのか記号の意味がわからないです。 help vimgrep に :vimgrep /\<FileName\>/ *.h include/*  のような同じ書き方がのってましたが 意味はのってなく、他のサイトで探してもみつからないです。 よろしくお願いします。
mattn

2017/08/17 00:47

:help /\< に載っています。
eisaku123

2017/08/17 01:41

いろいろご教授ありがとうございます。 \ は単語の境界とわかりました。 < はどんな意味があるのでしょう? これがないと成立しないです。
mattn

2017/08/17 01:44

\ が境界なのでなく \< もしくは \> が境界なのです。 :help /\< を見て下さい。 */\<* \< Matches the beginning of a word: The next char is the first char of a word. The 'iskeyword' option specifies what is a word character. |/zero-width|
eisaku123

2017/08/17 02:18

\< が境界と示すために先頭に /を入れてると\がメタキャラから記号に変化して \< の2つセットでメタキャラと認識させて境界の意味を示していると考えれば良いでしょうか?
yoshitia

2017/08/17 02:56

\<、\>はこれ自体がメタキャラなのでどちらか片方だけでも使えます。\<が単語の左側の境界、\>が単語の右側の境界です。 error\>ならerror123は外せますが123errorがヒットします。
eisaku123

2017/08/17 03:03

/  がないと検索できないのはなぜでしょうか? \<、\>  は理解しました。
mattn

2017/08/17 03:14

/ が無いと検索できないの意味が分かりませんでした。vim の検索コマンドは / です。
yoshitia

2017/08/17 04:28

vimgrepでは検索条件の文字列は/で囲まないと検索条件として認識されないからですね。 /以外で囲むやり方もあるようですが良くわかりません。
mattn

2017/08/17 04:37

vimgrep は // で括ると正規表現で、括らない場合は固定文字列として検索します。単語の境界というのは固定文字列では表現できませんので正規表現でパターンを作る必要があります。
yoshitia

2017/08/17 04:40

すごく勉強になりますm(_ _)m
eisaku123

2017/08/17 07:52

この質問を通じていろいろ勉強になりました。
guest

0

まず vimを起動して
:help vimgrep
してみたら簡単な使用例は載っていますよ。

vimgrep /error/ .
と書けば現在の作業フォルダ内のファイル全てにerrorの文字が無いか検索かけてくれます。
//の間に検索したい文字を入れればまず完全一致になると思います。

投稿2017/08/16 14:23

編集2017/08/16 14:29
yoshitia

総合スコア157

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshitia

2017/08/16 14:40

もし正規表現自体初めてであればVimの正規表現はクセがあるので 可能ならサクラエディタの検索機能で勉強した方がはかどると思います。
eisaku123

2017/08/16 14:40

お世話になります。上記のやり方で、errorをerror123 としてvimgrep /error/ *.* としても 検索されてしまいますよ。
yoshitia

2017/08/16 14:45

んー完全一致というのは例えば"error"5文字だけの行を探したいってことなら vimgrep /^error$/ *.* ですかね? ^は行頭って意味で$は行末です。
yoshitia

2017/08/16 14:52

コメントした後で説明見ちゃいました。すみません。
eisaku123

2017/08/16 15:01

/^error$/  だと 例えばこの行に   error kkkk のようなものがあると検索されないです。
yoshitia

2017/08/16 15:02

:vimgrep /[^\S]*error[^\S]*/ *.*
eisaku123

2017/08/16 15:13

これでも error kkkkはヒットしてしまいます。とほほ。。  また \ が¥ にしかならないです。
yoshitia

2017/08/16 15:48

\が¥¥になるのは環境の問題なので気にしなくていいです。 結構難しいなあ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問