|
sub() 函数原型如下:sub(regexp, replacement, target) 它的功能是:从 target 里查找是否有 regexp 的匹配,有则用 replacement 替换之。注意,这里的匹配只匹配最先匹配的一个(也就是最左边的那个0)。如果要全部匹配,那么需要用 gsub() 函数。
测试:# awk 'BEGIN { mystr = "welcome to groad groad"; sub(/groad/, "GROAD.NET", mystr); print mystr}'
welcome to GROAD.NET groad 由上面的输出可见,只有最左边(leftmost)的 groad 被替换了。
实际上第 3 个参数为可选,下面考虑一个 & 符号的情形:# echo hello groad | awk '{sub(/groad/, "&.net forum"); print }'
hello groad.net forum 在替代参数里的 & 符号就是被匹配的字串,这里是 groad 。需要注意的是, & 并不只是一个常量,而是可以代表整个正则表达式:$ awk 'BEGIN { str = "kaayaaa"; sub(/a*/, "x&x", str); print str }'
xxkaayaaa 上面的结果似乎并不如我们所想,我们或许希望输出的是 kxaaxyxaaax 。分析一下这个输出结果的原因:在正则里面,* 符号表示匹配 0 次或多次,而 sub 函数则是仅匹配并替换最左边一个的,因此 & 符号这里匹配的是“空”,故而只有前面输出两个 x 。
我们可以将上面的命令改为下面的:# awk 'BEGIN { str = "kaayaaa"; gsub(/a+/, "x&x", str); print str }'
kxaaxyxaaax 如上输出正是我们所希望的。注意 gsub() 函数里,正则里使用的是 + 符号,它表示匹配 1 次或多次。
上面两个示例中都用到了 & 符号,那么我们想输出真正的 & 符号怎么办?答案是在其前面加上两个反斜杠,即 \\& ,如果只写一个,会看到命令执行后的提示:awk: warning: escape sequence `\&' treated as plain `&' |
|