正規表現の使い方を覚えよう
UNIX/Linuxを便利に扱うために覚えておきたい基礎知識のひとつに「正規表現」があります。
エディタの vi や grep や awk、Perlなどのツールや言語でも正規表現の使い方を知っていると何十倍も作業効率が上がります。
正規表現 と ワイルドカード
あなたは正規表現とワイルドカードの違いがわかりますか?
僕はファイルやディレクトリに関わる作業をする時に「ワイルドカード」。
文字列をコマンドやプログラムやエディタで扱う時は「正規表現」。と単純に割り切って使っています。
はじめにワイルドカードについて知識を整理しましょう。
ワイルドカードとはLinuxコマンドラインで複数のファイルやディレクトリを操作する場合に利用する特殊記号のことです。
* | 任意の0文字以上の文字列。 |
? | 任意の1文字。 |
[] | 大カッコ内のいずれかの文字。[ace]であればaかcかeのどれか。[0-8]とハイフンを使うと0から8の間のいずれかの数字になる。[!dfh]とエクスクラメーションマークを使うとdでもfでもhでも無い任意の1文字を意味する。 |
{,} | 中カッコ内の,(カンマ)で区切られた文字列のいずれか。{test.txt,hoge*.txt}であればtest.txtもしくはhoge(任意の文字列).txtがヒットする。 |
正規表現とは
いくつかの文字列を一つの形式で表現するための表現方法です。
よく使われる特殊文字 (メタ文字)一覧
表現 | 意味 |
. | 改行(\n、\r)を除くすべての文字 |
^ | 行頭の位置(シングルラインモード:行頭、マルチライン:文章の頭) |
$ | 行末の位置 |
A|B | 「|」の左右の文字列のいずれか(A, Bのいずれか) |
\X | 直後のメタ文字Xをエスケープする |
[X] | 文字クラス。カッコ内に指定した文字のうち、いずれかの一文字 |
[X-Y] | 文字クラス内のハイフンは、文字の文字コード上の範囲を指定できる |
[^X] | 否定の文字クラス。カッコ内で指定した文字以外のいずれかの一文字 |
(X) | サブパターン。カッコ内のパターンにマッチした文字列を後方参照できる。ネスト可能。 |
^ | 行頭の位置(シングルラインモード) |
$ | 行末の位置(シングルラインモード) |
\b | 単語境界の位置 |
\B | 非単語境界の位置 |
\A | 検索対象文字列の開始位置(複数行モードとは無関係) |
\Z | 検索対象文字列の終了位置(複数行モードとは無関係)改行があれば、改行の直前 |
\z | 検索対象文字列の終了位置(複数行モードとは無関係) |
\G | マッチングの開始位置 |
\a | ベル文字 |
\cX | Ctrl + X(Xは任意の文字) |
\n | 改行コード(Line Feed) |
\r | 改行コード(Carriage Return) |
\f | 改ページ |
\R | すべての改行コード(「\n|\r|\n\r」と同義) |
\t | タブ |
\v | 垂直タブ |
\s | 空白文字(半角スペース、\t、\n、\r、\f)すべての文字。( |\t|\n|\r|\f)と同義 |
\S | 空白文字以外のすべての文字 |
\d | 数字。[0-9]と同義 |
\D | 数字以外の文字列。[^0-9]と同義 |
\w | すべてのアルファベットとアンダースコアのうち任意の一文字。[a-zA-Z0-9_]と同義 |
\W | すべてのアルファベットとアンダースコア以外の1文字[^a-zA-Z0-9_]と同義 |
\l | すべての半角英小文字のうち1文字 |
\L | すべての半角英小文字の以外の文字1文字(英大文字、数字、全角文字など含む) |
\u | すべての半角英大文字のうち1文字 |
\U | すべての半角英大文字以外の1文字(英小文字、数字、全角文字など含む) |
\0 | NULL文字(0の後に数字を続けると、8進数を表す数字を表すエスケープシーケンスとなるので注意) |
エディタの vi は、検索・置換を行う時の正規表現の扱い方が上記と異なります。
エスケープが必要なメタ文字 | +, ?, (, ), &pipe; |
正規表現の種類 3つ
- 文字を指定
- 文字数を指定する
- 文字の位置を指定する
UNIX/Linuxで覚えておくと絶対に便利な正規表現。
一度に覚えられなくても、正規表現の使い方を意識しながら徐々に使えるようになるよう頑張りましょう。