探す

INPUT · スライド

形で探す(正規表現)

01 / 09

「言葉」では言い表せない探し物

前のレッスンの grep は「この言葉がある行」を探す道具だったね。でも、探したいものがいつも言葉で言えるとは限らないよ。

  • 「電話番号が書いてある行」
  • 「日付から始まる行」
  • 「メールアドレスっぽいところ」

これは言葉ではなく形だね。形を言い表すための書き方が 正規表現 だよ。

02 / 09

正規表現は「文字の形を書く記号」

正規表現は、grep だけのものではないよ。sedawk・エディタの検索、それに JavaScript や Python にも入っている。一度覚えるとどこでも使えるんだ。

ここで覚えるのは6つだけ。これで実務の8割は書けるよ。

| 記号 | 意味 |
| --- | --- |
| ^ | 行のはじまり |
| $ | 行のおわり |
| . | なんでも1文字 |
| [abc] | この中のどれか1文字 |
| [^abc] | この中以外の1文字 |
| * | 直前をくり返す(0回以上) |

03 / 09

`^` と `$` — はしを留める

いちばんよく使うのがこの2つだよ。

  • ^ss始まる
  • com$com終わる

留めないと「どこかにあれば当たる」になってしまう。grep satosato@example.com の中の sato にも当たるけれど、^sato なら行頭の名前だけだよ。

留めるほど正確になる。これが正規表現の考え方の中心だよ。

~ $ grep '^s' renrakusaki.txtsuzuki 080-3333-4444 suzuki@example.jpsato 03-5555-6666 sato@example.com

04 / 09

`.` と `[]` — 1文字ぶんの穴

. は「なんでもいい1文字」だよ。c.tcat にも cut にも当たる。

[] はもっと厳しくて、「この中のどれか1文字」。[sy] なら sy。範囲でも書けるよ。

  • [0-9] … 数字1文字
  • [a-z] … 小文字1文字
  • [A-Za-z] … 英字1文字

[^0-9] のように ^ を中に入れると「それ以外」になるよ。[] の外にある ^ とは意味が違うので気をつけて。

~ $ grep '090-....-....' renrakusaki.txttanaka 090-1111-2222 tanaka@example.comyamada 090-7777-8888

05 / 09

`*` と `.*`

*直前のものをくり返す印だよ。0回でもいいので、ab*cac にも abbbc にも当たる。

いちばんよく使うのは .* の組み合わせ。「なんでもいい1文字」を「いくらでも」なので、なんでもいい並びになるよ。

```
grep '090.*com' renrakusaki.txt
```

「090 があって、そのあとどこかに com がある行」だね。find* と形が似ているけれど、意味は違うよ。正規表現の * は単独では使えなくて、.* と書く必要があるんだ。

06 / 09

`-E` で書きやすくする

ここまでが「基本の正規表現」。実は、もう少し便利な記号があるんだけれど、それを使うには -E を付ける必要があるよ。

| 記号 | 意味 |
| --- | --- |
| + | 直前を1回以上くり返す |
| ? | 直前があってもなくてもいい |
| \| | どちらか |
| () | ひとまとめにする |
| {3} | ちょうど3回 |

-E を付けないとこれらは書けない(\{3\} のように毎回 \ が要る)ので、迷ったら -E を付けるのがおすすめだよ。

~ $ grep -E '^[0-9]{4}-[0-9]{2}-[0-9]{2}' kiroku.txt2026-08-21 10:00 start2026-08-21 10:05 error

07 / 09

記号そのものを探したいとき

. は「なんでも1文字」なので、本物のドットを探したいときは困るよね。

そういうときは前に \ を付けて「これは記号ではなく文字だよ」と伝えるんだ。これをエスケープと言うよ。

```
grep '1\.2\.3' kiroku.txt # 本物のドット
grep '1.2.3' kiroku.txt # 1x2x3 にも当たってしまう
```

エスケープが要るのは . * [ ] ^ $ \ などだよ。忘れると「なぜか余計なものが出る」という形で表れるので、多すぎたらエスケープを疑う

08 / 09

クォートで囲む理由

正規表現は必ずクォートで囲むよ。

$*? はシェルにとっても特別な記号なので、囲まないと grep に届く前にシェルが手を出してしまうんだ。

```
grep 'com$' file # ◯
grep com$ file # × 思った通りにならないことがある
```

シングルクォート ' を使うのがおすすめ。ダブルクォート " だと $ がシェルに食べられてしまうことがあるからね(くわしくは「シェルの環境」の章で)。

09 / 09

さあ、打ってみよう

renrakusaki.txt に5人の連絡先が入っているよ。電話番号があるのは4人、メールがあるのは4人、両方あるのは3人だよ。

kiroku.txt には日付の書き方がまちまちな記録が入っているよ。2026-08-21 のようにきちんとしたものと、2026-8-21 のように桁が足りないものが混ざっているんだ。

形で選り分けるのを体で覚えよう。