曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3663|回复: 0
打印 上一主题 下一主题

sub() -- 替换一个匹配的子串

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-4-5 17:16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 `&'
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 04:59 , Processed in 0.078107 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表