5

好的,直截了当,这是代码,我对代码进行了一些格式化以便于阅读:

awk '{
t=$0   ; 
$0=t   ; $0=//           ; print "$0=//           ; value of $0 is ",$0
$0=t   ; $0=/./          ; print "$0=/./          ; value of $0 is ",$0
$0=t   ; $0=/*/          ; print "$0=/*/          ; value of $0 is ",$0
$0=t   ; $0=/**/         ; print "$0=/**/         ; value of $0 is ",$0
$0=t   ; $0=/[0-9]/      ; print "$0=/[0-9]/      ; value of $0 is ",$0
$0=t   ; $0=/[a-z]/      ; print "$0=/[a-z]/      ; value of $0 is ",$0
$0=t   ; $0=/[0-9][a-z]/ ; print "$0=/[0-9][a-z]/ ; value of $0 is ",$0
$0=t   ; $0=/5/          ; print "$0=/5/          ; value of $0 is ",$0
$0=t   ; $0=/55/         ; print "$0=/55/         ; value of $0 is ",$0
$0=t   ; $0=/x/          ; print "$0=/x/          ; value of $0 is ",$0
$0=t   ; $0=/5x/         ; print "$0=/5x/         ; value of $0 is ",$0
$0=t   ; $0=/x5/         ; print "$0=/x5/         ; value of $0 is ",$0
$0=t   ; $0=/xoo/        ; print "$0=/xoo/        ; value of $0 is ",$0
$0=t   ; $0=/500/        ; print "$0=/500/        ; value of $0 is ",$0
}'<<<"5x"

我得到了这个输出:

$0=//           ; value of $0 is  1
$0=/./          ; value of $0 is  1
$0=/*/          ; value of $0 is  0
$0=/**/         ; value of $0 is  1
$0=/[0-9]/      ; value of $0 is  1
$0=/[a-z]/      ; value of $0 is  1
$0=/[0-9][a-z]/ ; value of $0 is  1
$0=/5/          ; value of $0 is  1
$0=/55/         ; value of $0 is  0
$0=/x/          ; value of $0 is  1
$0=/5x/         ; value of $0 is  1
$0=/x5/         ; value of $0 is  0
$0=/xoo/        ; value of $0 is  0
$0=/500/        ; value of $0 is  0

我不明白为什么我得到这个输出。我以为 awk 会抱怨赋值语句,但它没有......当我这样做时,awk 似乎正在做奇怪的正则表达式匹配检查$0=/xxx/?也就是说,$0=/pattern/$0=$0~/pattern/?

然后我做了这个测试:

kent$  echo "xx"|awk '{y="777";y=/x/;print y}'                                                                                                                              
1

kent$  echo "xx"|awk '{y="777";y=/7/;print y}'                                                                                                                              
0

所以看起来,foo=/pattern/是一样的foo=$0~/pattern/

但我不确定......在文档/手册页中找不到信息。

我在这里@ SO 回答 awk 问题时发现了它。

我用我的 awk 进行了测试:

kent$  awk --version|head -1
GNU Awk 4.1.0, API: 1.0 (GNU MPFR 3.1.2, GNU MP 5.1.2)

如果有人可以解释我,我很感激。提前致谢。

编辑

在进行了更多测试之后,事实证明(再次,不确定,因为我没有在文档中找到它),inside {...}, only 是与外部相同/pattern/的缩写形式, like 。所以我们可以这样做:$0~/pattern/{...}/patter/{do something}

kent$  echo "xx"|awk '{if(/x/)print "ok"}'                                                                                                                                  
ok

我不知道这是否是 awk 脚本语法的标准功能。如果它适用于所有 awk 实现。我仍在搜索手册和手册页...

4

2 回答 2

6

/regexp/只是简写$0 ~ /regexp/

var = ($0 ~ /regexp/)分配 var 比较的结果,1 为真,否则为零。

$0 = ($0 ~ /regexp/)将 $0 和 /regexp/ 的比较结果分配给 $0

$0 = ($0 ~ //)分配 $0 在 $0 中查找空字符串的结果,总是存在的,所以条件为真所以结果为 1

$0 = //做同样的事情

$0 = /*/正在寻找*$0 中的文字,因此结果为零。

$0 = /**/正在寻找*在 $0 中重复零次或多次的文字,其中有零次,因此结果为 1。

没有神秘,没有什么奇怪的...

于 2013-09-13T21:41:43.673 回答
2

这里并不神秘,您只是将值设置$0为评估的正则表达式匹配的值。首先计算右侧,如果该行与正则表达式匹配,则结果为 True即 1,否则结果为 False即 0

于 2013-09-13T21:41:15.017 回答