sub和gsub的区别
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