■正規表現とは
正規表現とは、「 ^ 」のような特定の記号(メタ文字)を使用する。
正規表現には、いくつか種類があり、使用するメタ文字も異なる。その中でも、代表的な正規表現は、「基本正規表現」と「拡張正規表現」である。
今回は、正規表現の使用方法を備忘録として記す。
■やりたいこと
以下のファイルについて「grep」コマンドと正規表現を使用して検索していく。
▼sample.txt
/work/aaa/hoge_1.txt
/work/aaa/hoge_5.txt
/work/aaa/hoge_a.txt
/work/aaa/hoge_a.conf
/work/aaa/hoge_abc.conf
/work/aaa/hoge_abcabc.conf
/work/aaa/hoge_b.txt
/work/aaa/hoge_p.txt
/work/aaa/hoge_p.conf
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/work/bbb/hoge_D.txt
/work/bbb/hoge_7.txt
/work/bbb/hoge_E.txt
/tmp/ccc/hoge_1.txt
/tmp/ccc/hoge_b.txt
/tmp/ddd/hoge_c.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_s.txt
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_b.txt
/tmp/eee/hoge_c.txt
/tmp/eee/hoge_Y.conf
/tmp/eee/hoge_s.txt
▼数字や文字で特定する
任意の数字や文字を指定する方法を下表に示す。
基本正規表現 | 拡張正規表現 | 概要 |
---|---|---|
[ ] | [ ] | [ ]の中に含まれるいずれかの1文字 |
[^ ] | [^ ] | [ ]の中に含まれないいずれかの1文字 |
・任意の数字1つ
$ grep 'hoge_[1]' sample.txt
/work/aaa/hoge_1.txt
/work/bbb/hoge_1.txt
/tmp/ccc/hoge_1.txt
/tmp/ddd/hoge_1.txt
$ grep 'hoge_[2]' sample.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
$ grep 'hoge_[3]' sample.txt
hoge_[3]はsample.txtに存在しないため、何も表示されない。
・任意の数字2つ
$ grep 'hoge_[12]' sample.txt
/work/aaa/hoge_1.txt
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/tmp/ccc/hoge_1.txt
/tmp/ddd/hoge_1.txt
hoge_1またはhoge_2が検索結果に表示される。
・任意の数字1から9
$ grep 'hoge_[0-9]' sample.txt
/work/aaa/hoge_1.txt
/work/aaa/hoge_5.txt
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/work/bbb/hoge_7.txt
/tmp/ccc/hoge_1.txt
/tmp/ddd/hoge_1.txt
sample.txt内のhoge_[数字]が表示される。
・任意の数字1から9以外
$ grep 'hoge_[^0-9]' sample.txt
/work/aaa/hoge_a.txt
/work/aaa/hoge_a.conf
/work/aaa/hoge_abc.conf
/work/aaa/hoge_abcabc.conf
/work/aaa/hoge_b.txt
/work/aaa/hoge_p.txt
/work/aaa/hoge_p.conf
/work/bbb/hoge_D.txt
/work/bbb/hoge_E.txt
/tmp/ccc/hoge_b.txt
/tmp/ddd/hoge_c.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_s.txt
/tmp/eee/hoge_b.txt
/tmp/eee/hoge_c.txt
/tmp/eee/hoge_Y.conf
/tmp/eee/hoge_s.txt
sample.txt内のhoge_[数字]以外が表示される。
・任意の文字1つ(小文字)
$ grep 'hoge_[a]' sample.txt
/work/aaa/hoge_a.txt
/work/aaa/hoge_a.conf
/work/aaa/hoge_abc.conf
/work/aaa/hoge_abcabc.conf
$ grep 'hoge_[b]' sample.txt
/work/aaa/hoge_b.txt
/tmp/ccc/hoge_b.txt
/tmp/ccc/hoge_b.conf
/tmp/eee/hoge_b.txt
sample.txt内のhoge_[英語小文字]が表示される。
・任意の文字aからz(小文字)
$ grep 'hoge_[a-z]' sample.txt
/work/aaa/hoge_a.txt
/work/aaa/hoge_a.conf
/work/aaa/hoge_abc.conf
/work/aaa/hoge_abcabc.conf
/work/aaa/hoge_b.txt
/work/aaa/hoge_p.txt
/work/aaa/hoge_p.conf
/tmp/ccc/hoge_b.txt
/tmp/ddd/hoge_c.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_s.txt
/tmp/eee/hoge_b.txt
/tmp/eee/hoge_c.txt
/tmp/eee/hoge_s.txt
sample.txt内のhoge_[英語小文字]が表示される。
・任意の文字aからz以外(小文字)
$ grep 'hoge_[^a-z]' sample.txt
/work/aaa/hoge_1.txt
/work/aaa/hoge_5.txt
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/work/bbb/hoge_D.txt
/work/bbb/hoge_7.txt
/work/bbb/hoge_E.txt
/tmp/ccc/hoge_1.txt
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_Y.conf
sample.txt内のhoge_[英語小文字]以外が表示される。
・任意の文字AからZ(大文字)
$ grep 'hoge_[A-Z]' sample.txt
/work/bbb/hoge_D.txt
/work/bbb/hoge_E.txt
/tmp/eee/hoge_Y.conf
sample.txt内のhoge_[英語大文字]が表示される。
・任意の数字1から9と文字AからZ(大文字)
$ grep 'hoge_[0-9A-Z]' sample.txt
/work/aaa/hoge_1.txt
/work/aaa/hoge_5.txt
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/work/bbb/hoge_D.txt
/work/bbb/hoge_7.txt
/work/bbb/hoge_E.txt
/tmp/ccc/hoge_1.txt
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_Y.conf
sample.txt内のhoge_[数字]とhoge_[英語大文字]表示される。
▼位置で特定する
位置を指定する方法を下表に示す。
基本正規表現 | 拡張正規表現 | 概要 |
---|---|---|
^ | ^ | 先頭 |
$ | $ | 末尾 |
・先頭の文字を指定
$ grep '^/tmp' sample.txt
/tmp/ccc/hoge_1.txt
/tmp/ccc/hoge_b.txt
/tmp/ddd/hoge_c.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_s.txt
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_b.txt
/tmp/eee/hoge_c.txt
/tmp/eee/hoge_Y.conf
/tmp/eee/hoge_s.txt
sample.txt内の/tmpで始まる文字が表示される。
・末尾の文字を指定
$ grep '1.txt$' sample.txt
/work/aaa/hoge_1.txt
/work/bbb/hoge_1.txt
/tmp/ccc/hoge_1.txt
/tmp/ddd/hoge_1.txt
sample.txt内の1.txtで終わる文字が表示される。
▼繰り返しで特定する
繰り返しで特定する方法を下表に示す。
基本正規表現 | 拡張正規表現 | 概要 |
---|---|---|
* | * | 0以上の繰り返し(ワイルドカード) |
なし | + | 1回以上の繰り返し |
なし | ? | 0または1回以上の繰り返し |
\{m,n\} | {m,n} | m回以上、n回以下の繰り返し |
\{m\} | {m} | m回の繰り返し |
\{m,\} | {m,} | m回以上の繰り返し |
\{, n\} | {,n} | n回以下の繰り返し |
・0以上の繰り返し(ワイルドカード)
$ grep '/tmp*' sample.txt
/tmp/ccc/hoge_1.txt
/tmp/ccc/hoge_b.txt
/tmp/ddd/hoge_c.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_s.txt
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_b.txt
/tmp/eee/hoge_c.txt
/tmp/eee/hoge_Y.conf
/tmp/eee/hoge_s.txt
sample.txt内の/tmpを含む文字が表示される。
・1以上の繰り返し
$ grep -E '/tmp+' sample.txt
/tmp/ccc/hoge_1.txt
/tmp/ccc/hoge_b.txt
/tmp/ddd/hoge_c.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_s.txt
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_b.txt
/tmp/eee/hoge_c.txt
/tmp/eee/hoge_Y.conf
/tmp/eee/hoge_s.txt
sample.txt内の/tmpを含む文字が表示される。
※拡張正規表現を使用する場合は、grepコマンドのオプション「-E」を付与する。
・0または1回の繰り返し
$ grep -E '.con?' sample.txt
/work/aaa/hoge_a.conf
/work/aaa/hoge_abc.conf
/work/aaa/hoge_abcabc.conf
/work/aaa/hoge_p.conf
/work/bbb/hoge_2.conf
/tmp/ccc/hoge_b.conf
/tmp/eee/hoge_Y.conf
sample.txt内の.confを含む文字が表示される。
・2回以上4回以下の繰り返し
$ grep '/work/b\{2,4\}' sample.txt
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/work/bbb/hoge_D.txt
/work/bbb/hoge_7.txt
/work/bbb/hoge_E.txt
$ grep -E '/work/b{2,4}' sample.txt
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.txt
/work/bbb/hoge_2.conf
/work/bbb/hoge_D.txt
/work/bbb/hoge_7.txt
/work/bbb/hoge_E.txt
sample.txt内の/bbbを含む文字が表示される。
▼複数条件(OR句)で特定する
複数条件を指定する方法を下表に示す。
基本正規表現 | 拡張正規表現 | 概要 |
---|---|---|
なし | | | 複数条件(OR句) |
$ grep -E 'hoge_[1]|.conf$' sample.txt
/work/aaa/hoge_1.txt
/work/aaa/hoge_a.conf
/work/aaa/hoge_abc.conf
/work/aaa/hoge_abcabc.conf
/work/aaa/hoge_p.conf
/work/bbb/hoge_1.txt
/work/bbb/hoge_2.conf
/tmp/ccc/hoge_1.txt
/tmp/ccc/hoge_b.conf
/tmp/ddd/hoge_1.txt
/tmp/eee/hoge_Y.conf
sample.txt内のhoge_1もしくは末尾が.confのものを表示する。
コメント