01 / 09
「言葉」では言い表せない探し物
前のレッスンの grep は「この言葉がある行」を探す道具だったね。でも、探したいものがいつも言葉で言えるとは限らないよ。
- 「電話番号が書いてある行」
- 「日付から始まる行」
- 「メールアドレスっぽいところ」
これは言葉ではなく形だね。形を言い表すための書き方が 正規表現 だよ。
探す
INPUT · スライド
01 / 09
前のレッスンの grep は「この言葉がある行」を探す道具だったね。でも、探したいものがいつも言葉で言えるとは限らないよ。
これは言葉ではなく形だね。形を言い表すための書き方が 正規表現 だよ。
02 / 09
正規表現は、grep だけのものではないよ。sed・awk・エディタの検索、それに JavaScript や Python にも入っている。一度覚えるとどこでも使えるんだ。
ここで覚えるのは6つだけ。これで実務の8割は書けるよ。
| 記号 | 意味 |
| --- | --- |
| ^ | 行のはじまり |
| $ | 行のおわり |
| . | なんでも1文字 |
| [abc] | この中のどれか1文字 |
| [^abc] | この中以外の1文字 |
| * | 直前をくり返す(0回以上) |
03 / 09
いちばんよく使うのがこの2つだよ。
^s … s で始まる行com$ … com で終わる行留めないと「どこかにあれば当たる」になってしまう。grep sato は sato@example.com の中の sato にも当たるけれど、^sato なら行頭の名前だけだよ。
留めるほど正確になる。これが正規表現の考え方の中心だよ。
~ $ grep '^s' renrakusaki.txtsuzuki 080-3333-4444 suzuki@example.jpsato 03-5555-6666 sato@example.com04 / 09
. は「なんでもいい1文字」だよ。c.t は cat にも cut にも当たる。
[] はもっと厳しくて、「この中のどれか1文字」。[sy] なら s か y。範囲でも書けるよ。
[0-9] … 数字1文字[a-z] … 小文字1文字[A-Za-z] … 英字1文字[^0-9] のように ^ を中に入れると「それ以外」になるよ。[] の外にある ^ とは意味が違うので気をつけて。
~ $ grep '090-....-....' renrakusaki.txttanaka 090-1111-2222 tanaka@example.comyamada 090-7777-888805 / 09
* は直前のものをくり返す印だよ。0回でもいいので、ab*c は ac にも abbbc にも当たる。
いちばんよく使うのは .* の組み合わせ。「なんでもいい1文字」を「いくらでも」なので、なんでもいい並びになるよ。
```
grep '090.*com' renrakusaki.txt
```
「090 があって、そのあとどこかに com がある行」だね。find の * と形が似ているけれど、意味は違うよ。正規表現の * は単独では使えなくて、.* と書く必要があるんだ。
06 / 09
ここまでが「基本の正規表現」。実は、もう少し便利な記号があるんだけれど、それを使うには -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 error07 / 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 のように桁が足りないものが混ざっているんだ。
形で選り分けるのを体で覚えよう。