case文やsedの記事で正規表現について簡単にふれましたが、ここではもう少しだけ掘り下げて正規表現について考えてみます。

文字列を検索するとき、完全に一致する文字列を検索するケースより、ある文字列を含む文字列を検索したいなど、あいまいなパターンで検索したいケースの方が多いです。正規表現はそのあいまいなパターンを表すことができます。

正規表現の例

正規表現を使って何ができるか、シェルスクリプトを作成して簡単な例を見ていきましょう。

#!/bin/sh
grep ^a.*

grepコマンドはファイルや標準入力から特定の文字列を含む行を検索するコマンドです。

正規表現の部分は「^a.*」となります。分解してひとつずつ考えていきましょう。

.は「任意の1文字」を表します。
*は「*の直前のパターンを0回以上繰り返す」という意味です。
よって、「^a.*」は「行頭がaで、その後に0個以上の任意の文字が続く」、つまり「aで始まる行」という意味になります。

正規表現はシェルスクリプトに限らず、知っておくと様々なところで役立ちます。正規表現でどのような検索ができるのか、以下に例を示します。

正規表現の例 説明
^[0-9] 行頭が数字
[0-9]* 数字が0個以上繰り返す
[0-9]$ 行末が数字
^[0-9][0-9]*$ 行頭が数字で、その後に0個以上の数字が行末まで続く
^$ 行頭と行末の間に何もない。つまり空行
201[0-9] 201の後に任意の数字が1文字続く。2010~2019までが該当する
201[0-9]* 201の後に任意の数字が0文字以上続くこと。201、2010、20100などが該当する
..*\.jp 行末が.jpで終わる。ただし、.jpの前に任意の文字が1文字以上あることが条件