環境
おそらくPOSIX互換のawk
であればどれでも同じ問題が起きるはずだが、一応実行環境を書いておく。
GNU Awk 5.2.0, API 3.2, PMA Avon 7, (GNU MPFR 4.1.0-p13, GNU MP 6.2.1)
概要
例えば、現在のレコードが、バックスラッシュを含むか調べようとして、以下の様に書くとエラーになる。
# エラー: $0 ~ /\/ と解釈される
$0 ~ "\\" {print "match"}
これは文字列定数を処理する時と、正規表現の処理をする時とで、合わせて二回、エスケープシーケンスの処理が行われるためだ。つまり、文字列定数を正規表現に使う場合、特殊文字を二重にエスケープしなければならない。
# $0 ~ /\\/ と解釈されるので期待通り動く
$0 ~ "\\\\" {print "match"}
記述が冗長になるので、awkの正規表現には、文字列定数の代わりに、//
でパターンを囲うスタイルを使ったほうが良い。