探す

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 のように桁が足りないものが混ざっているんだ。

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