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

sub和gsub的区别

awk '{sub(/aa/,"cc");print}' urfile    用Macintosh替换Mac
awk '{sub(/aa/,"cc",$1); print}' file    第一个域内用Macintosh替换Mac
把上面sub换成gsub就表示在满足条件得域里面替换所有的字符。

比如如下文件内容:

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

使用上述的awk的sub的第一种用法,可以得到如下结果

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

使用sub的第二种用法,结果如下

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 

猜你喜欢

转载自blog.csdn.net/Leo_csdn_/article/details/81478580