通常,//文字正则表达式永远不会紧跟在文字或变量名之前。前面可能有~,!和其他一些运算符。在某些情况下//隐含的意思是$0 ~ //。
/除法运算符之前总是有一个右值(变量、函数调用、文字、表达式),作为/=一种特殊情况。
请注意,awk对空格的处理不如C,
printf("%i", 1
/2/3);
在 awk 中无效。然而,这些是有效的(ish)awk(用gawkand测试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
这不是一个简单的任务,如果您熟悉标记化和解析,请从这里开始:
(古代)awkgram.y(包含在 中awkpretty)比gawk's 更简单。
您可能比解析以下输出做得更糟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请注意使用旧的bison,bison-1.35为我使用 " YACC=bison-1.35 -y"before configure。)
编辑:的输出似乎有点奇怪awklex,标记 59 是;,最后token 59可能是一个隐含的终止符,但它被歪曲为}. 中的注释awkunlex.awk意味着它是一个错误。
$ awklex '/a/+0/2 {print}' | gawk -f awkunlex.awk
/a/+0/2 {print}