greple #4 複数キーワード検索 OR

# 注意

この記事は Version 8 までに関するものです。Greple Version 9 から、`--le` オプション内での `?` は、OR ではなくて MAY を表すように変更されました。Version 9 以降では、OR 条件を指定するためには正規表現を使ってください。その方が簡単だしわかりやすいので、そのように仕様変更しました。

# 複数キーワードによる検索 OR編

前回は、指定した複数のキーワードをすべて含む行を表示する方法について説明しました。今回は、A か B のどちらかが含まれればいいという条件を指定する方法について紹介します。

## `--le` オプションの `?` 指定

前回と同じ寿司セットの検索を考えます。

```sushi.txt
サービスセット      熟成まぐろ えび たまご いか サーモン いなり ねぎまぐろ サラダ
お子様セット        熟成まぐろ えび たまご いなり ツナサラダ
特上セット          中とろ 熟成まぐろ 熟成真鯛 はまち 赤えび ほたて うなぎ かに いくら
特上極旨セット      中とろ はまち かに いくら 赤えび サーモン うなぎ うに
うどんセット        熟成まぐろ サーモン たまご えび うどん
サラダ軍艦セット    えびマヨ ツナサラダ サラダ シーフードサラダ
人気セット          熟成まぐろ 漬けまぐろ サーモン びんちょう いか えび えびアボカド たまご
まぐろづくしセット  中とろ 熟成まぐろ ねぎまぐろ
プレミアムセット    中とろ まぐろ サーモン 赤えび はまち うなぎ かに いくら
```

前回は**まぐろ**と**はまち**の両方を含むセットを探しましたが、**はまち**が入っているセットは少ないので選択肢が限られます。妥協して、代わりに**えび**でもいいことにしましょう。

このような場合は、次のようにキーワードの先頭に `?` マークを指定します。

```
greple -n 'まぐろ ?はまち ?えび' sushi.txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/8f8ea7ce-3418-c0bf-d1bf-e87a2db26202.png)

だいぶ選択肢が増えました。

## 複数の `--le` オプションを使う

選択肢が増えて気が大きくなってきたので、上の条件に加えて、**うに**か**いくら**も食べたくなりました。

```
greple -n 'まぐろ ?はまち ?えび ?うに ?いくら' sushi.txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/930f4aae-e3d1-1f29-83e8-c9c7c27a5c7c.png)

こうすると、はまち、えび、うに、いくら、のどれかが入っていればいいということになってしまって、期待した結果が得られません。

このような場合は `--le` を複数回指定します。

```
greple -n --le 'まぐろ ?はまち ?えび' --le '?うに ?いくら' sushi.txt
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/13f137fe-7683-0e82-cd0d-d431e2337bd7.png)

OR キーワードは、それぞれの `--le` オプション内でグループ化され、オプション同士は AND で評価されるため、全体としては次のような意味になります。

```
まぐろ AND (はまち OR えび) AND (うに OR いくら)
```

結果は、それぞれの検索条件毎に色分けされて、見やすく表示されています。

上の例で、最初の `--le` を省略することはできません。greple は、パターンオプションが指定されていない時のみ、最初の引数をパターンと解釈するので、この `--le` を省略すると次の引数はファイル名として扱われてしまいます。

## 正規表現を使う

上の例は、正規表現の `|` 記法を使って次のように書いても、まったく同じ意味になります。実は `?` 記号がついたキーワードについては、内部的にこのような表現に変換して評価しています。

```
greple -n --le 'まぐろ はまち|えび' --le 'うに|いくら' sushi.txt
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/da95128e-5670-d712-f85a-47b56356a2d1.png)

さらには、この例では `?` を使っていないので `--le` オプションは1つにまとめてしまっても問題ないし、その場合は省略することもできます。

```
greple -n 'まぐろ はまち|えび うに|いくら' sushi.txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/965b2923-108c-503c-6605-970f23833d2e.png)


慣れている人には、この方がわかりやすいかもしれません。

## まとめ

`--le` オプションに複数キーワードを指定する際に、OR 条件を指定する方法を紹介しました。

grep を使って同じことをやろうとすれば、やはりパイプを使うことになると思います。

```
grep -n まぐろ sushi.txt | egrep 'はまち|えび' | egrep 'うに|いくら
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/36fa36b7-05bd-54ba-857e-00d390dc07b2.png)

このくらいになってくると、少し greple を使うメリットが感じられてくるでしょうか。条件が複雑になってくると、条件毎に色分けしてくれるのがありがたく感じられる局面も増えてきます。

## SEE ALSO

https://qiita.com/advent-calendar/2021/greple

1. https://qiita.com/kaz-utashiro/items/5b6bcbe54891b3bd9db5
2. https://qiita.com/kaz-utashiro/items/eb8c7067e6de34842fe3
3. https://qiita.com/kaz-utashiro/items/165e744d4250adedc4c1
4. https://qiita.com/kaz-utashiro/items/439e6abcecf36c520703 ←イマココ
5. https://qiita.com/kaz-utashiro/items/24ac0b8fdd30b598e069
6. https://qiita.com/kaz-utashiro/items/a1ba4e3d07cf37dc25e3
7. https://qiita.com/kaz-utashiro/items/0c8c944c17a72724b771
8. https://qiita.com/kaz-utashiro/items/8783c2fd0cc4315b9a3d
9. https://qiita.com/kaz-utashiro/items/84f5a6be6bf996076c64
10. https://qiita.com/kaz-utashiro/items/ebc7ea99f800cfc8c90c
11. https://qiita.com/kaz-utashiro/items/25a14e75380c39b5e0af
12. https://qiita.com/kaz-utashiro/items/ebbeb8a5538a15ff04fc
13. https://qiita.com/kaz-utashiro/items/b265deef9c9b1953a414
14. https://qiita.com/kaz-utashiro/items/2b20e0226cffde213ce0
15. https://qiita.com/kaz-utashiro/items/16b5142ef7a89aa35380
16. https://qiita.com/kaz-utashiro/items/d19fe5ee859f31ce172c
17. https://qiita.com/kaz-utashiro/items/09a5f5cf08ce314e2add
18. https://qiita.com/kaz-utashiro/items/6e4b1f51455e587ef743

- https://github.com/kaz-utashiro/greple
- https://metacpan.org/dist/App-Greple