使用AWK打印由正则表达式分隔符分隔的字符串中的字段时出现的模糊结果

时间:2015-12-22 21:24:55

标签: regex awk

我正在探索在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

在我的linux机器上运行时,我获得了以下输出
[1]
[2]v
[3]ke
[4]vr
[5]

这种行为上的差异是一个版本或另一个版本中的错误吗?如果这是一个错误,我应该期待什么输出?如果我对正则表达式的理解是正确的,BusyBox v1.19.2返回的输出是正确的。如果我错了,请纠正我。

无论AWK版本如何,是否有其他方法可靠地获得相同的结果?

编辑#1

使用分隔符[ad]+我不希望输出中出现空字符串,因为分隔符模式无法计算为空字符串,但我仍然使用gawkbusybox看到它们。

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

1 个答案:

答案 0 :(得分:0)

前者是perl兼容的re行为(模式第一个贪婪匹配最长的子字符串,然后是空字符串),后者不是。为简单起见,在这种情况下最好使用+而不是*。