关于shell编程(3):awk中的sub和gsub

subgsub的区别

awk '{sub(/aa/,"cc");print}' file        ;用cc替换aa
awk '{sub(/aa/,"cc",$1); print}' file    ;第一个域内用cc替换aa

把上面sub换成gsub就表示在满足条件的域里面替换所有的字符。

比如如下文件内容:

aa我们    aa我们
aaaa一起    aaaa一起
回家    aa回家

使用上述的awk的sub的2个参数的用法awk '{sub(/aa/,"cc");print}' file,可以得到如下结果

cc我们    aa我们       #只改变坐起第一个aa
ccaa一起    aaaa一起
回家    cc回家      #第一个字段中没有aa,就继续寻找下一个字段,直到找到第一个aa并替换

使用sub的第二种3参数用法awk '{sub(/aa/,"cc",$1); print}' file,结果如下

cc我们    aa我们    
ccaa一起    aaaa一起
回家   aa回家       #第一个字段中没有aa直接结束本行的替换

如果使用gsub,两种不同参数的方法得到的结果分别如下

#不加$1
cc我们    cc我们
cccc一起    cccc一起        #全部替换
回家   cc回家

#添加$1
cc我们   aa我们
cccc一起   aaaa一起
回家    aa回家                #第一个域内全部替换,其他域不管


awk的sub函数用法:
sub函数匹配指定域/记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。
如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。格式如下:

sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)

实例:

$ awk '{ sub(/test/, "mytest"); print }' testfile
$ awk '{ sub(/test/, "mytest", $1); print }' testfile

      第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。
      第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候。
如要在整个文件中进行匹配需要用到gsub
gsub函数作用如sub,但它在整个文档中进行匹配。格式如下:

gsub (regular expression, substitution string)
gsub (regular expression, substitution string, target string)

实例:

$ awk '{ gsub(/test/, "mytest"); print }' testfile
$ awk '{ gsub(/test/, "mytest", $1); print }' testfile

      第一个例子在整个文档中匹配test,匹配的都被替换成mytest。
      第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest。
另外, 只有当记录中的域有改变的时候 ,指定0FS变量才有用, 如果记录中的域无变化, 指定OFS产生不了实际效果。


awk -F'|' -v OFS='|' '{ gsub(/[0-9]/, "", $3); print $0; }' data.txt   


将把第三个域中所有数字都去掉。


另外,对于数字的匹配,可以使用十六进制。


awk -F'|' -v OFS='|' '{ gsub(/[/x30-/x39]/, "", $3); print $0; }' data.txt 

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值