通常,//
文字正则表达式永远不会紧跟在文字或变量名之前。前面可能有~
,!
和其他一些运算符。在某些情况下//
隐含的意思是$0 ~ //
。
/
除法运算符之前总是有一个右值(变量、函数调用、文字、表达式),作为/=
一种特殊情况。
请注意,awk
对空格的处理不如C
,
printf("%i", 1
/2/3);
在 awk 中无效。然而,这些是有效的(ish)awk(用gawk
and测试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}