我在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测试)。
答案 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
}'