我正在探索在awk
中使用正则表达式作为字段分隔符。我想出了下面的例子来分割一个由正则表达式分隔符[ad]*
分隔出来的字符串和打印字段。
echo avadakedavra | awk -F '[ad]*' '{for (i = 1; i <= NF; i++) {print "["i"]"$i}}'
以下是在运行AWK版本BusyBox v1.19.2
的MobaXterm上运行此脚本时获得的输出:
[1]
[2]v
[3]
[4]k
[5]e
[6]
[7]v
[8]r
[9]
[10]
然而,当我使用GNU Awk 3.1.5
:
[1]
[2]v
[3]ke
[4]vr
[5]
这种行为上的差异是一个版本或另一个版本中的错误吗?如果这是一个错误,我应该期待什么输出?如果我对正则表达式的理解是正确的,BusyBox v1.19.2
返回的输出是正确的。如果我错了,请纠正我。
无论AWK版本如何,是否有其他方法可靠地获得相同的结果?
编辑#1
使用分隔符[ad]+
我不希望输出中出现空字符串,因为分隔符模式无法计算为空字符串,但我仍然使用gawk
和busybox
看到它们。
echo avadakedavra | awk -F '[ad]+' '{for (i = 1; i <= NF; i++) {print "["i"]"$i}}'
gawk 3.1.5
上的输出是:
[1]
[2]v
[3]ke
[4]vr
[5]
而Busybox v1.19.2
上的输出是:
[1]
[2]v
[3]ke
[4]vr
[5]vra
同样,我尝试使用不同的正则表达式a[d]*
作为分隔符,gawk
上的输出为:
[1]
[2]v
[3]
[4]ked
[5]vr
[6]
BusyBox
回复了以下内容:
[1]
[2]v
[3]
[4]ked
[5]vr
[6]a
答案 0 :(得分:0)
前者是perl兼容的re行为(模式第一个贪婪匹配最长的子字符串,然后是空字符串),后者不是。为简单起见,在这种情况下最好使用+而不是*。