bokumin.org

Github

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では使えません。

 


 

文字コード指定

 

記号説明使用例
\ooo8進数コード(3桁)の文字\101 → A
\xhh16進数コード(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 -PPerl互換正規表現(PCRE)-P\d, \w, \s, 先読み・後読みなど使用可能(実験的機能)
sed基本正規表現(BRE)デフォルト+, ?, {}, `
sed -E拡張正規表現(ERE)-E または -r+, ?, {}, `
awk拡張正規表現(ERE)デフォルトAWK独自の構文と制限あり
perlPerl互換正規表現(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ディストリビューションやツールのバージョンによって、サポートされる機能が異なる場合がありますので、最終的には自分の環境にあった正規表現を使うことが重要です。

 

普段あまり使わないものは忘れがちで、探すのに手間取り、かえって時間がかかってしまうことが多々なので、メモとして残してます。