awk正規表現一覧

タグ: awk   gawk  

gawkの正規表現をまとめてみます。公式ドキュメントも必要に応じて参照してください。

正規表現操作子

操作子 説明
\ 右の操作子の機能・意味を抑制し、その文字自身としてマッチさせる
^ 文字列の先頭
$ 文字列の最後
. どんな文字でも1文字にマッチする
[…] カギカッコの中の文字の、どれか1文字にマッチする
[^…] カギカッコの中の文字以外の、どれか1文字にマッチする
| 縦棒の左か右の表現にマッチする(or)
(…) グルーピング
* 左の表現に0回以上マッチする
+ 左の表現に1回以上マッチする
? 左の表現と0回、もしくは1回マッチする
{n} 左の表現のn回繰り返しにマッチする
{n,} 左の表現のn回以上の繰り返しにマッチする
{n,m} 左の表現のn回以上、m回以下の繰り返しにマッチする

他の言語の正規表現と異なり、^$がそれぞれ行頭、行末を表しているのではないことに注意する。つまり、改行コードを基準としたマッチングではない。

*+は最長マッチで、最短マッチ(*?+?)は実装されていない。この対策をネットでは見かけないが、否定を使えば簡単だ。たとえば、HTMLのタグとマッチさせるために<.+>の正規表現を使うと、一行の中に複数タグが存在すると最初の正規表現が大食いし、思い通りに動作しない。これを否定のマッチングを使い<[^>]+>とすれば、意図通りに動作する。

文字1つと*の繰り返しの正規表現、たとえばa*はgawkの場合NULL文字列とも一致する。その意味は文字列の前後と、文字間全箇所と一致するということである。

$ echo 'sunday' | awk '{ gsub(/a*/, "X"); print $0; }'
XsXuXnXdXyX

*は「0回以上の繰り返し」とマッチする。aの0回の繰り返しとは、NULL文字列になる。それが文字列の前後と、文字間という、gawkが正規表現のマッチングを行うそれぞれの箇所で、NULL文字列で一致と判定される。

上記の例の場合、d文字まで比較が進んだ時点を考えると、d文字は不一致で置き換えが起きない。da間の判定で、NULL文字列(実際には存在しない空の文字列)がXに置き換わり、次にaa-y間のNULL文字列が一致するが、正規表現は「左からできるだけ長く」一致する方針のため、aa-y間のNULL文字列がX一つに置き換わる。次にy文字を比較するが不一致で、置き換えが起きず、yの後の判定で再度NULL文字列と一致と判定され、Xに置き換えが起きる。

エスケープシーケンス

文字列 説明
\ 文字としてのバックスラッシュ \
\a "alert"文字、Ctrl-g, ASCIIコード 7 (BEL)
\b バックスペース、Ctrl-h, ASCIIコード 8 (BS)
\f 改ページ、Ctrl-l, ASCIIコード 12 (FF)
\n 改行、Ctrl-j, ASCIIコード 10 (LF)
\r キャレッジリターン、Ctrl-m, ASCIIコード 13 (CR)
\t 垂直タブ、Ctrl-i, ASCIIコード 9 (HT)
\v 水平タブ、Ctrl-k, ASCIIコード 11 (VT)
\nnn 文字コードの8進数表現
\xhh 文字コードの16進表現
\/ 文字としてのスラッシュ /

POSIXスタンダード

クラス 意味
[:alnum:] 英数字文字
[:alpha:] アルファベット
[:blank:] 空白とタブ
[:cntrl:] 制御文字
[:digit:] 数字
[:graph:] 印刷可能かつ可視文字
[:lower:] アルファベットの小文字
[:print:] 印刷可能文字
[:punct:] 句読点(英数字、制御文字、空白文字以外の文字)
[:space:] 空白文字(空白、タブ、改ページ)
[:upper:] アルファベットの大文字
[:xdigit:] 16進数を構成する文字
[.照合シンボル.] 照合シンボル
[=アルファベット=] アルファベットとその異形字(符号付きなど)

照合シンボルと、アルファベットの異形字はローケルで定義されているものが利用できる。データベースの照合機能などで利用するため、日本語に関する定義は真面目に定義されているが、gawkに実装されているかは未確認。(ドキュメントを読む限り、未実装でも設定すれば利用できそう。ただ、設定しているローケルで対象自然言語が決まるのでは利用範囲が狭いため、本格的なプログラミングではライブラリが充実している言語を選んだほうがベターと思われる。)

gawk限定

文字列 説明
\s 空白文字。[[:space:]]と同じ。
\S 空白文字以外の文字。
\w 語を構成する文字。英数と下線。[[:alnum:]]と同じ。
\W 語を構成していない文字。
\< 語の先頭と一致。
\> 語の終わりと一致。
\y 語の先頭と終わりに一致。
\B 語の途中に一致。
\` バッファの先頭に一致。
\' バッファの終わりに一致。

その他

デフォルトの正規表現のマッチングは、ケースセンスビリティ(大文字と小文字を区別する)です。大文字と小文字を同一としてマッチングしたい場合は、IGNORECASE = 1を指定します。その後、再度区別する場合は、IGNORECASE = 0とします。