gawk sub()与&符和toupper()无法正常工作

时间:2016-02-26 15:47:46

标签: awk

我在gawk toupper()中使用sub()时遇到问题。我正在使用&替换匹配字符串的功能。

$ gawk '{sub(/abc/, toupper("&")); print $0; }'
xabcx
xabcx

我期待:

xABCx

变体toupper()但没有&&但没有toupper()的变种:

$ gawk '{sub(/abc/, toupper("def")); print $0; }'
xabcx
xDEFx

$ gawk '{sub(/abc/, "-&-"); print $0; }'
xabcx
x-abc-x

tolower()类似地失败。我是否误解了&的工作原理? (使用gawk 3.1.x和最新的4.1.3测试)。

1 个答案:

答案 0 :(得分:2)

我想我知道发生了什么:在构造替换字符串之前,toupper函数正在评估第一个

所以你得到了

sub(/abc/, toupper("def")) => sub(/abc/, "DEF")

和不那么有用的

sub(/abc/, toupper("&")) => sub(/abc/, "&")

要获得所需的结果,您必须先提取匹配,大写,然后然后执行替换:

$ echo foobar | gawk '{sub(/o+/, toupper("&")); print}'
foobar
$ echo foobar | gawk '{
    if (match($0, /o+/, m)) {
        replacement = toupper(m[0])
        sub(/o+/, replacement)
    }
    print
}'
fOObar

或者,你不需要sub,你可以这样重建记录:

echo foobar | gawk '{
    if (match($0, /o+/, m)) {
        $0 = substr($0, 1, RSTART-1) toupper(m[0]) substr($0, RSTART+RLENGTH)
    }
    print
}'