awkの正規表現で文字列定数を使う場合、特殊文字を二重にエスケープしなければならない

tags: [awk]

環境

おそらくPOSIX互換のawkであればどれでも同じ問題が起きるはずだが、一応実行環境を書いておく。

概要

例えば、現在のレコードが、バックスラッシュを含むか調べようとして、以下の様に書くとエラーになる。

# エラー: $0 ~ /\/ と解釈される
$0 ~ "\\" {print "match"}

これは文字列定数を処理する時と、正規表現の処理をする時とで、合わせて二回、エスケープシーケンスの処理が行われるためだ。つまり、文字列定数を正規表現に使う場合、特殊文字を二重にエスケープしなければならない。

# $0 ~ /\\/ と解釈されるので期待通り動く
$0 ~ "\\\\" {print "match"}

記述が冗長になるので、awkの正規表現には、文字列定数の代わりに、//でパターンを囲うスタイルを使ったほうが良い。

参考