Linux 正規表現(Regex)チートシート
Linux Regular Expression(Regex) Cheat Sheet
Linuxの正規表現をサクっとチートシートにしてみました。参考にしてもらえれば幸いです。
特殊文字(メタ文字)
| 記号 | 説明 | 使用例(一致する文字) |
|---|---|---|
. | 任意の1文字にマッチ | a.c → abc, adc, a1c など |
^ | 行の先頭にマッチ | ^abc → 「abc」で始まる行 |
$ | 行の末尾にマッチ | abc$ → 「abc」で終わる行 |
* | 直前の文字の0回以上の繰り返し | ab*c → ac, abc, abbc, abbbc… |
\ | 次の文字をエスケープ | \. → ドット文字そのもの |
※ +, ?, |, (), {} は拡張正規表現(ERE)またはPCREで使用可能です。基本正規表現(BRE)では \+, \?, \|, \( \), \{ \} とエスケープが必要です。
文字クラスと範囲
| 記号 | 説明 | 使用例(一致する文字) |
|---|---|---|
[abc] | 括弧内のいずれか1文字にマッチ | [abc] → a, b, または c |
[^abc] | 括弧内以外の任意の1文字にマッチ | [^abc] → a, b, c 以外の任意の文字 |
[a-z] | 範囲指定(a から z の小文字) | [a-z] → 小文字のアルファベット1文字 |
[A-Z] | 範囲指定(A から Z の大文字) | [A-Z] → 大文字のアルファベット1文字 |
[0-9] | 範囲指定(0 から 9 の数字) | [0-9] → 任意の数字1文字 |
POSIX文字クラス
使用時は [[:alnum:]] のように二重の括弧で囲みます。
| 記号 | 説明 | 使用例 |
|---|---|---|
[:alnum:] | 英数字 | [[:alnum:]] → a-z, A-Z, 0-9 |
[:alpha:] | アルファベット | [[:alpha:]] → a-z, A-Z |
[:blank:] | 空白(スペースとタブ) | [[:blank:]] → スペースまたはタブ |
[:digit:] | 数字 | [[:digit:]] → 0-9 |
[:lower:] | 小文字 | [[:lower:]] → a-z |
[:upper:] | 大文字 | [[:upper:]] → A-Z |
[:space:] | 空白文字 | [[:space:]] → スペース、タブ、改行など |
[:punct:] | 句読点 | [[:punct:]] → 句読点記号 |
[:xdigit:] | 16進数の数字 | [[:xdigit:]] → 0-9, a-f, A-F |
繰り返し指定
基本正規表現(BRE: grep, sed)
| 記号 | 説明 | 使用例 |
|---|---|---|
\{n\} | 直前の文字をちょうどn回繰り返す | a\{3\} → aaa |
\{n,\} | 直前の文字をn回以上繰り返す | a\{2,\} → aa, aaa, aaaa… |
\{n,m\} | 直前の文字をn回以上m回以下繰り返す | a\{2,4\} → aa, aaa, aaaa |
拡張正規表現(ERE: grep -E, egrep)
| 記号 | 説明 | 使用例 |
|---|---|---|
+ | 直前の文字の1回以上の繰り返し | ab+c → abc, abbc, abbbc… |
? | 直前の文字の0回または1回の出現 | ab?c → ac, abc |
{n} | 直前の文字をちょうどn回繰り返す | a{3} → aaa |
{n,} | 直前の文字をn回以上繰り返す | a{2,} → aa, aaa, aaaa… |
{n,m} | 直前の文字をn回以上m回以下繰り返す | a{2,4} → aa, aaa, aaaa |
※ GNU grepでは基本正規表現でも \+ が使えますが、これはGNU拡張機能です。
選択と代替
基本正規表現(BRE)
| 記号 | 説明 | 使用例 |
|---|---|---|
| | 選択(OR演算子) | cat|dog → 「cat」または「dog」 |
\( \) | グループ化 | \(cat|dog\)s → 「cats」または「dogs」 |
拡張正規表現(ERE)
| 記号 | 説明 | 使用例 |
|---|---|---|
| ` | ` | 選択(OR演算子) |
( ) | グループ化 | `(cat |
エスケープシーケンスと特殊表現
BRE/ERE共通
| 記号 | 説明 | 使用例 |
|---|---|---|
\n | 改行文字 | line\n → 「line」の後に改行 |
\t | タブ文字 | column\t → 「column」の後にタブ |
PCRE専用(grep -P)
| 記号 | 説明 | 使用例 |
|---|---|---|
\d | 数字一文字 [0-9] と同等 | \d{3} → 3桁の数字 |
\D | 非数字 [^0-9] と同等 | \D+ → 1文字以上の非数字 |
\w | 単語構成文字 [a-zA-Z0-9_] と同等 | \w+ → 1文字以上の単語構成文字 |
\W | 非単語構成文字 | \W+ → 1文字以上の非単語構成文字 |
\s | 空白文字 | \s+ → 1文字以上の空白文字 |
\S | 非空白文字 | \S+ → 1文字以上の非空白文字 |
\b | 単語境界 | \bcat\b → 単語「cat」のみ |
\B | 非単語境界 | \Bcat\B → 「cat」が単語の中間 |
※ \d, \w, \s などはPerl互換正規表現(PCRE)の機能で、grep -P でのみ使用可能です。通常のgrep/sedでは使えません。
文字コード指定
| 記号 | 説明 | 使用例 |
|---|---|---|
\ooo | 8進数コード(3桁)の文字 | \101 → A |
\xhh | 16進数コード(2桁)の文字 | \x41 → A |
バックリファレンス(後方参照)
基本正規表現(BRE)
sed 's/\(abc\)\1/XYZ/g' # abcabc → XYZ
拡張正規表現(ERE)
sed -E 's/(abc)\1/XYZ/g' # abcabc → XYZ
| 記号 | 説明 | 使用例 |
|---|---|---|
\1, \2… | 前の括弧で囲まれたパターンを参照 | \(abc\)\1 → abcabc(BRE) |
(abc)\1 → abcabc(ERE) |
※名前付きキャプチャグループ (?<name>) はPCREでのみ使用可能です。
先読み・後読み(PCRE専用: grep -P)
| 記号 | 説明 | 使用例 |
|---|---|---|
(?=pattern) | 肯定先読み | foo(?=bar) → 「foobar」の「foo」 |
(?!pattern) | 否定先読み | foo(?!bar) → 後ろに「bar」がない「foo」 |
(?<=pattern) | 肯定後読み | (?<=foo)bar → 「foobar」の「bar」 |
(?<!pattern) | 否定後読み | (?<!foo)bar → 前に「foo」がない「bar」 |
その他の特殊構文(PCRE)
| 記号 | 説明 | 使用例 |
|---|---|---|
(?:pattern) | 非キャプチャグループ | (?:abc)+ → 「abc」の1回以上の繰り返し |
(?i) | 大文字小文字を区別しない | (?i)abc → ABC, abc, Abcなど |
sed置換コマンドのフラグ
sedの置換コマンド s/検索/置換/フラグ で使用できるフラグは以下のものです。
| フラグ | 説明 | 使用例 |
|---|---|---|
g | 各行のすべてのマッチを置換 | sed 's/old/new/g' |
p | 置換した行を出力 | sed -n 's/old/new/p' |
i または I | 大文字小文字を区別しない | sed 's/old/new/gi' |
数字 | n番目のマッチのみ置換 | sed 's/old/new/2' (2番目のみ) |
w ファイル | 置換した行をファイルに書き込み | sed 's/old/new/w out.txt' |
sed 's/old/new/gp' といった形に組み合わせが可能となっています。
sedコマンドオプション
| オプション | 説明 | 使用例 |
|---|---|---|
-e | スクリプト指定(複数指定可) | sed -e 's/a/b/' -e 's/c/d/' |
-i | ファイルを直接編集(GNU sed) | sed -i 's/old/new/g' file.txt |
-n | 自動出力を抑制 | sed -n '1,5p' file.txt |
-E または -r | 拡張正規表現を使用 | sed -E 's/(abc)+/XYZ/g' |
Linuxツールごとの正規表現の違い
| ツール | 正規表現タイプ | オプション | 注意点 |
|---|---|---|---|
grep | 基本正規表現(BRE) | デフォルト | +, ?, {}, ` |
grep -E / egrep | 拡張正規表現(ERE) | -E | +, ?, {}, ` |
grep -P | Perl互換正規表現(PCRE) | -P | \d, \w, \s, 先読み・後読みなど使用可能(実験的機能) |
sed | 基本正規表現(BRE) | デフォルト | +, ?, {}, ` |
sed -E | 拡張正規表現(ERE) | -E または -r | +, ?, {}, ` |
awk | 拡張正規表現(ERE) | デフォルト | AWK独自の構文と制限あり |
perl | Perl互換正規表現(PCRE) | デフォルト | 最も強力で多機能 |
注意点
1. 基本正規表現(BRE)と拡張正規表現(ERE)の違い
基本正規表現では +, ?, |, (), {} などのメタ文字を使う際にバックスラッシュでエスケープが必要ですが、拡張正規表現ではこれらを直接使用できます。
# BRE (基本正規表現)
grep 'a\{5\}' file.txt # aaaaa にマッチ
grep 'aa\+' file.txt # aa, aaa, aaaa... にマッチ(GNU拡張)
# ERE (拡張正規表現)
grep -E 'a{5}' file.txt # aaaaa にマッチ
grep -E 'aa+' file.txt # aa, aaa, aaaa... にマッチ
2. PCRE(Perl互換正規表現)の利用
GNU grepでは -P オプションでPCREが使用でき、\d, \w, \s などのショートハンド文字クラスや先読み・後読みが利用可能です。ただし、grep -Pは実験的機能であり、環境によってはサポートされていない場合があります。
# PCRE使用例
grep -P '\d{3}-\d{4}' file.txt # 123-4567 のような電話番号
grep -P '\w+@\w+\.\w+' file.txt # メールアドレス
3. sedの基本と拡張正規表現
sedでは -E オプション(一部の環境では -r)を使って拡張正規表現を有効にできます。
# BRE
sed 's/\(abc\)\+/XYZ/g' file.txt
# ERE
sed -E 's/(abc)+/XYZ/g' file.txt
実用例
grepでの検索
# 基本的な検索
grep 'error' log.txt
# 拡張正規表現で複数パターン
grep -E 'error|warning|fatal' log.txt
# 行番号付きで表示
grep -n 'error' log.txt
# 大文字小文字を区別しない
grep -i 'error' log.txt
# PCRE で数字のみの行
grep -P '^\d+$' file.txt
sedでの置換
# 基本的な置換
sed 's/old/new/' file.txt
# すべて置換
sed 's/old/new/g' file.txt
# ファイルを直接編集
sed -i 's/old/new/g' file.txt
# 拡張正規表現を使用
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/g' file.txt
まとめ
基本正規表現(BRE)と拡張正規表現(ERE)では、特殊文字のエスケープが異なるということと、Unicode関連の機能はすべてのツールでサポートされているわけではなく、主にPerl互換正規表現(PCRE)を使用するツールでのみ使用可能であるという点に注意が必要です。
また、利用するLinuxディストリビューションやツールのバージョンによって、サポートされる機能が異なる場合がありますので、最終的には自分の環境にあった正規表現を使うことが重要です。
普段あまり使わないものは忘れがちで、探すのに手間取り、かえって時間がかかってしまうことが多々なので、メモとして残してます。