複数キーワードによる検索
パターンオプション
greple には、パターンを指定するために以下のようなオプションがあります。オプション指定がない場合には、最初のコマンド引数がパターンとされ、これは --le
オプションで指定されたのと同様に扱われます。
PATTERN
pattern 'and +must -not ?optional &function'
-x, --le pattern lexical expression (same as bare pattern)
-e, --and pattern pattern match across line boundary
-r, --must pattern pattern cannot be compromised
-t, --may pattern pattern may be exist
-v, --not pattern pattern not to be matched
-E, --re pattern regular expression
--fe pattern fixed expression
追記: 2023年1月にリリースした Version 9 から ?
で始まるキーワードの意味が大きく変わっています。それまでは or
を意味するものでしたが、オプショナル、つまりあってもなくてもいいという意味で、-t
, --may
オプションに対応しています。
--le
オプションによる複数キーワード指定
--le
(または -x
) は lexical expression の略としていて greple の le もここから来ています。単なる文字列ではなくて、意味を持ったトークンの集まりというような意味合いですが、英語として通じるか実はちょっと不安です。とりあえず、ブラウザの検索欄と同じように考えてもらえばいいと思います。
検索エンジンの検索欄に空白で区切って複数の単語を並べると、そのすべての文字列にマッチするページを表示しようとしてくれます。greple の --le
オプションも同様で、空白で区切られた検索トークンのすべてが含まれる行を表示します。
前回の寿司セットを例に試してみます。
サービスセット 熟成まぐろ えび たまご いか サーモン いなり ねぎまぐろ サラダ
お子様セット 熟成まぐろ えび たまご いなり ツナサラダ
特上セット 中とろ 熟成まぐろ 熟成真鯛 はまち 赤えび ほたて うなぎ かに いくら
特上極旨セット 中とろ はまち かに いくら 赤えび サーモン うなぎ うに
うどんセット 熟成まぐろ サーモン たまご えび うどん
サラダ軍艦セット えびマヨ ツナサラダ サラダ シーフードサラダ
人気セット 熟成まぐろ 漬けまぐろ サーモン びんちょう いか えび えびアボカド たまご
まぐろづくしセット 中とろ 熟成まぐろ ねぎまぐろ
プレミアムセット 中とろ まぐろ サーモン 赤えび はまち うなぎ かに いくら
前回はまぐろが入っているセットを検索しましたが、やっぱりはまちも食べたいので、まぐろとはまちが入っているセットを探します。
2つのセットがあることがわかります。
ほたても食べたいと探すと、特上セット一択になりました。
このように、greple のパターンに空白で区切って複数のキーワードを指定すると、その全てを含む行を表示します。
grep の場合
grep も -e
オプションを繰り返し使用することで、複数のキーワードを指定することができます。同じように、まぐろとはまちを探してみます。
grep の場合は、複数のパターンを指定すると、そのいずれかが含まれる行を表示します。
では、まぐろとはまちの両方が入っているセットを検索するためにはどうするかというと、まず思いつくのはパイプでつなぐことです。
あるいは、まぐろとはまちの両方が含まれるパターンを指定する方法もあります。
しかし、これでははまちの方が先に出てきた場合に対応することができません。どちらにも対応しようとするとこうなります。
この例では grep ではなく egrep を使っています。grep で同じ結果を得るためには |
を \|
に置き換えます。
見てわかるように、まぐろとはまち以外の部分もマッチしてしまうので、その部分に色をつけるためには、最後にもう一度 egrep を通します。
これで grep でも、greple と同じ出力を得ることができました。ただ、これ以上キーワードが増えていくとちょっと大変なので、やはりパイプを使った方がよさそうです。
両方を含む行にマッチする正規表現
順序に関係なくまぐろとはまちの両方を含む行にマッチさせる正規表現を作ることも可能です。
正規表現の先読み (look-ahead) の機能を使って、(?=.*まぐろ)
と (?=.*はまち)
の両方の条件を満たす行頭 (^
) を探しています。ripgrep 標準の正規表現は先読みをサポートしていないので --pcre2
オプションを使っています。
幅のない行頭にしかマッチしていないので、まぐろとはまちはカラー出力されません。この ^
はなくても同じ結果になりますが、正規表現エンジンの作りによっては非効率な動作になる可能性があるので、あった方がいいでしょう。
マルチカラーハイライト
3種類の寿司ネタを探した例で、それぞれのネタが違う色で表示されていたことに気が付いたでしょうか。
greple はこのように複数のキーワードが指定された場合、それぞれにマッチする部分を異なる色でハイライトして表示します。色に関するオプションについては、いずれ詳しく説明します。
まとめ
greple で複数のキーワードを指定して、そのすべてが含まれる行を出力する方法について説明しました。同様な処理を別のツールを使って実行するのはそれほど簡単ではありません。
まとまった文章の執筆や校正をしていると、場所は覚えていないけど、どこかにあったはずの説明を参照したくなることがあります。「TCP の再送とタイムアウトについて、どこに書いてあったっけ」というような状況です。この例であれば 'TCP 再送 タイムアウト' という3つのキーワードを含む部分を探せばいいわけです。
そうは言っても、1行の中にすべてのキーワードが含まれているとは限らないじゃないか、と思われるでしょうか。大丈夫です。そのような場合についても、いずれ考えてみましょう。
SEE ALSO
- https://qiita.com/kaz-utashiro/items/5b6bcbe54891b3bd9db5
- https://qiita.com/kaz-utashiro/items/eb8c7067e6de34842fe3
- https://qiita.com/kaz-utashiro/items/165e744d4250adedc4c1 ←イマココ
- https://qiita.com/kaz-utashiro/items/439e6abcecf36c520703
- https://qiita.com/kaz-utashiro/items/24ac0b8fdd30b598e069
- https://qiita.com/kaz-utashiro/items/a1ba4e3d07cf37dc25e3
- https://qiita.com/kaz-utashiro/items/0c8c944c17a72724b771
- https://qiita.com/kaz-utashiro/items/8783c2fd0cc4315b9a3d
- https://qiita.com/kaz-utashiro/items/84f5a6be6bf996076c64
- https://qiita.com/kaz-utashiro/items/ebc7ea99f800cfc8c90c
- https://qiita.com/kaz-utashiro/items/25a14e75380c39b5e0af
- https://qiita.com/kaz-utashiro/items/ebbeb8a5538a15ff04fc
- https://qiita.com/kaz-utashiro/items/b265deef9c9b1953a414
- https://qiita.com/kaz-utashiro/items/2b20e0226cffde213ce0
- https://qiita.com/kaz-utashiro/items/16b5142ef7a89aa35380
- https://qiita.com/kaz-utashiro/items/d19fe5ee859f31ce172c
- https://qiita.com/kaz-utashiro/items/09a5f5cf08ce314e2add
- https://qiita.com/kaz-utashiro/items/6e4b1f51455e587ef743