好的,直截了当,这是代码,我将代码格式化了一点,以便于阅读:
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会抱怨任务声明,但它没有...当我做$0=/xxx/
时,似乎awk正在进行奇怪的正则表达式匹配检查?也就是说,$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/
但我不确定...无法在文档/手册页中找到信息。
当我在这里回答一个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)
如果有人能解释我,我感激不尽。提前谢谢。
修改
经过更多的测试后,结果是(再次,不确定,因为我没有在文档中找到它),在 {...}
内,仅/pattern/
就是$0~/pattern/
的缩写形式与{...}
之外的缩写形式相同,如/patter/{do something}
。所以我们可以这样做:
kent$ echo "xx"|awk '{if(/x/)print "ok"}'
ok
我不知道它是否是awk脚本语法的标准功能。如果它适用于所有awk实现。我仍在搜索手册和手册页......
答案 0 :(得分:6)
/regexp/
只是$0 ~ /regexp/
var = ($0 ~ /regexp/)
指定var的比较结果,1表示true,否则为0。
$0 = ($0 ~ /regexp/)
为$ 0和/ regexp /
$0 = ($0 ~ //)
为$ 0分配$ 0的结果,总是有,所以条件为真所以结果为1
$0 = //
执行相同的操作
$0 = /*/
正在寻找$ 0中的文字*
,但结果不是零。
$0 = /**/
正在寻找文字*
重复零次或多次0美元,其中只有0,因此结果是1.
没有神秘感,没有什么奇怪的......
答案 1 :(得分:2)
这里没有谜,你只是将$0
的值设置为评估的正则表达式匹配的值。首先评估右侧,如果该行与正则表达式匹配,则结果为True ,即。 1 ,否则结果为False ,即。 0 的。