Vimを使う - 検索(その2)

【連載】

にわか管理者のためのLinux運用入門

【第223回】Vimを使う - 検索(その2)

[2020/03/31 08:00]後藤大地 ブックマーク ブックマーク

前回、Vimの検索では「パターン」と呼ばれる、意味を持った文字列を使った検索が可能であることを紹介した。検索で使えるパターンや、どのような指定ができるのかについては理解していただけたはずだ。

しかし、紹介した全てのパターンを覚えている方はあまりいないだろう。よく使うパターンはそれほど多くなく、大抵はよく使う正規表現の記述を繰り返し利用しているのではないだろうか。今回は、パターンを使った検索の例を取り上げ、具体的な検索方法について解説する。

パターンを使った検索のサンプル

ここでは次のようなHTMLファイルの中身を検索する例を取り上げる。これは本連載の一覧表示を行っているページのHTMLデータだ。

検索で使用するサンプルファイル - 本連載の一覧ページのHTMLデータ

まず、簡単な検索を行ってみる。「100%」という文字列を検索にかけると、次のように一致する文字列を検索することができる。

シンプルな文字列検索を行った場合

「100%」だと、当然ながら99%には一致しないし、0%にも一致しない。「数字%」という表記に一致させたい場合には、パターンを使って表記する必要がある。例えば、ここでは「[1-9][0-9]*%」で検索を行う。検索結果では、次のように「数字%」に一致するようになる。

[1-9][1-9]*%で「数字%」に一致する

[1-9][0-9]*%は、まず最初の[1-9]が、1文字目が1〜9までの何かの数字であることを意味し、[0-9]*で空文字か数字の繰り返しを意味するようになる。つまり、1%以上の「整数%」という表記に一致するようになる。「*」は、「0回以上の繰り返し」を意味しており、何も一致しないか、または1回以上の繰り返しということになる。正規表現でも似たような意味を持っており、応用範囲も広い。便利な指定なので、まず覚えてしまいたい記述の1つだ。

なお、本稿の末尾に前回掲載したのと同じパターン表を掲載しておくので、パターンを使う際の参考にしてもらえればと思う。

次のサンプルは、「http://」と「https://」を同時に検索している例だ。「https\=://」というパターンがこれを可能にしている。

「http://」と「https://」の双方に一致するパターン

「https\=://」のポイントは「\=」の部分だ。「\=」は「0回または1回の繰り返し」を意味するので、「s」があってもなくても、どちらも該当するようになる。「\?」も「\=」と同じなので、「\?」を使ってもよい。たくさんのパターンを覚えるのは無理だと感じたら、「{数以上,数以下}」の指定で全て書くようにするとよい。「{}」を使えば、今回のパターンは「{0,1}」になるから、「https{0,1}://」となる。なるべく覚える努力を減らしたい場合は、繰り返しに関しては「{}」の書き方だけ覚えてしまおう。

次は「[0-9]+.[0-9]+.[0-9]+」の検索例だ。これは「数字.数字.数字」といったバージョン番号を検索するために入力している。「確か3つに別れたバージョン番号スキームだったと思うけれど、一体何のことだったかな……」といった曖昧な記憶のまま検索したい場合などには、こういった使い方もできる。

「数字.数字.数字」で検索している例

「+」は「1回以上の繰り返し」だ。空文字には一致しない。「+」を覚えるのが面倒であれば、「{}」の書き方を使って「{1,1000}」のように書く方法もある。とにかく記憶するパターンを最小限に抑えておきたいなら、やはり「{}」の書き方を覚えるに限る。

パターンが使えるとすごく便利

パターンが使えるようになると検索の柔軟性が一気にアップする。最初から全て覚えることはできないと思うが、覚えておけばおくほど、とても便利である。最低限、「[]」と「{}」は最初に覚えてしまいたい。徐々に慣れたら、「^」「$」「.」「*」「+」「\=」辺りも自然と使えるようになると良いと思う。

最初から全てパーフェクトにパターンを使いこなす必要はない。少しずつ使えるパターンを増やしていって、より検索効率を上げていこう。Vimの検索パターンは正規表現と似ているところも多いので、パターンを習得すれば、自然と正規表現のスキルも向上するはずだ。

Appendix: 検索で使えるパターン

パターン 内容
^ 行頭(パターンの先頭でのみ指定可能)
$ 行末(パターンの末尾でのみ指定可能)
. 任意の1文字(行末には使用できない)
\%^ ファイルの先頭
\%$ ファイルの終了
\%V Visual領域の中
\%# カーソルの位置
\%’m マークm位置
\%数字l 指定行
\%数字c 指定列
\%数字v 指定仮想列
\_^ 行頭(パターンのどこでも指定可能)
\_$ 行末(パターンのどこでも指定可能)
\_. 任意の1文字(行末としても指定可能)
\< 単語の先頭
\> 単語の末尾
\zs 一致の開始を指定
\ze 一致の終了を指定
\^ ^
\$ $
. .
\e <ESC>
\t <TAB>
\r <CR>
\b <BS>
\n 行末
[] カッコ内に指定した文字のどれかに一致
\c 大文字小文字を区別せずに一致
\C 大文字小文字を区別して一致
\%d 10進数に一致
\%x 16進数に一致
\%o 8進数に一致
\%u マルチバイト文字に一致
\%U ラージマルチバイト文字に一致
\%C 合成文字に一致
\i 識別子文字
\I 識別子文字(数字は含まない)
\k キーワード文字
\K キーワード文字(数字は含まない)
\f ファイル名文字
\F ファイル名文字(数字は含まない)
\p 印刷可能文字
\P 印刷可能文字(数字は含まない)
\s 空白とタブ
\S 空白とタブ以外の文字
\d 数字([0-9])
\D 数字以外([^0-9])
\x 16進数([0-9A-Fa-f])
\X 16進数以外([^0-9A-Fa-f])
\o 8進数([0-7])
\O 8進数以外([^0-7])
\w 単語文字([0-9A-Za-z_])
\W 単語文字以外([^0-9A-Za-z_])
\h 単語の先頭文字([A-Za-z_])
\H 単語の先頭文字以外([^A-Za-z_])
\a アルファベット([A-Za-z])
\A アルファベット以外([^A-Za-z])
\l 小文字アルファベット([a-z])
\L 小文字アルファベット以外([^a-z])
\u 大文字アルファベット([A-Z])
\U 大文字アルファベット以外([^A-Z])
\_d 数字(行末を含む)
\_D 数字以外(行末を含む)
\_x 16進数(行末を含む)
\_X 16進数以外(行末を含む)
\_o 8進数(行末を含む)
\_O 8進数以外(行末を含む)
\_w 単語文字(行末を含む)
\_W 単語文字以外(行末を含む)
\_h 単語の先頭文字(行末を含む)
\_H 単語の先頭文字以外(行末を含む)
\_a アルファベット(行末を含む)
\_A アルファベット以外(行末を含む)
\_l 小文字アルファベット(行末を含む)
\_L 小文字アルファベット以外(行末を含む)
\_u 大文字アルファベット(行末を含む)
\_U 大文字アルファベット以外(行末を含む)
繰り返しパターン 内容
* 直前指定の0回以上の繰り返し(より長い方に一致)
\+ 直前指定の1回以上の繰り返し(より長い方に一致)
\= 直前指定の0回または1回の繰り返し(より長い方に一致)
\? 直前指定の0回または1回の繰り返し(より長い方に一致)
\{n,m} 直前指定のn回以上m回以下の繰り返し(より長い方に一致)
\{n} 直前指定のn回の繰り返し
\{n,} 直前指定のn回以上の繰り返し(より長い方に一致)
\{,m} 直前指定のm回以下の繰り返し(より長い方に一致)
\{} 直前指定の0回以下の繰り返し(より長い方に一致)
\{-n,m} 直前指定のn回以上m回以下の繰り返し(より短い方に一致)
\{-n} 直前指定のn回の繰り返し
\{-n,} 直前指定のn回以上の繰り返し(より短い方に一致)
\{-,m} 直前指定のm回以下の繰り返し(より短い方に一致)
\{-} 直前指定の0回以下の繰り返し(より短い方に一致)

※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。

一覧はこちら

連載目次

関連リンク

この記事に興味を持ったら"いいね!"を Click
Facebook で IT Search+ の人気記事をお届けします
注目の特集/連載
[解説動画] Googleアナリティクス分析&活用講座 - Webサイト改善の正しい考え方
[解説動画] 個人の業務効率化術 - 短時間集中はこうして作る
ミッションステートメント
教えてカナコさん! これならわかるAI入門
知りたい! カナコさん 皆で話そうAIのコト
対話システムをつくろう! Python超入門
Kubernetes入門
AWSで作るクラウドネイティブアプリケーションの基本
PowerShell Core入門
徹底研究! ハイブリッドクラウド
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ
セキュリティアワード特設ページ

一覧はこちら

今注目のIT用語の意味を事典でチェック!

一覧はこちら

会員登録(無料)

ページの先頭に戻る