一般に、//
リテラル正規表現の直前にリテラルまたは変数名が続くことはありません。~
、!
およびその他の演算子が先行する場合があります。場合によって//
は暗黙のうちに を意味し$0 ~ //
ます。
特殊なケースとして、除算演算子の/
前には常に右辺値 (変数、関数呼び出し、リテラル、式) が付きます。/=
awk
ほど空白について寛大ではないことに注意してくださいC
。
printf("%i", 1
/2/3);
awk では無効です。ただし、これらは有効な(ish)awkです(gawk
およびでテスト済みnawk
):
/a/+0/2 {print} # regex /a/
b /a/+0/2 {print} # not a regex (divide by zero)
## nawk will not accept anything after this line, gawk only
// {print} # empty regex, awk is not C99
/**/ {print } # dubious regex
/*/ { print "*/" } # awk is not C
{print //} # prints 1, equiv to ($0 ~ //)
/[/]/ { print } # tricky regex
トークン化と解析に精通している場合は、ここから始めてください。
(ancient) awkgram.y
(に含まれるawkpretty
) は、よりもはるかに単純な読み方ですgawk
。
おそらく、次の出力を解析するよりも悪いことをする可能性がありますawkpretty
。
$ awklex '/a/+0/2 {print}'
# line 1 "/dev/stdin"
47 token 47 /
335 REGEXPR a
47 token 47 /
43 token 43 +
333 NUMBER 0
47 token 47 /
333 NUMBER 2
337 WHITESPACE
123 token 123 {
319 PRINT print
59 token 59 }
125 token 125 }
0 token 0
nawk
ただし、これにより、互換性のある構文に制限されます。
awkpretty
(古い を使用するように注意してコンパイルする必要がある場合は、 " beforebison
で動作します。)bison-1.35
YACC=bison-1.35 -y"
configure
編集:の出力に少し奇妙な点があるようですawklex
。トークン 59 は です;
。最後token 59
は暗黙のターミネータである可能性がありますが、 で誤って表現されてい}
ます。のメモは、awkunlex.awk
それがバグであることを意味します。
$ awklex '/a/+0/2 {print}' | gawk -f awkunlex.awk
/a/+0/2 {print}