1 简单例子
通常对字符串的替换用sed的情况比较多,但是有时需要将字符串分成字段后,对某个字段进行替换操作,这时就需要用awk的内置字符串函数sub或gsub实现。
下面是样本字符串:
mm/dd,2018/01/22 00:00:01
操作1:将第一个“/”替换成空格,后面的“/”不变
$ echo "mm/dd,2018/01/22 00:00:01" | awk -F"," 'sub("/"," ")'
mm dd,2018/01/22 00:00:01
操作2:将所有“/”替换成空格
$ echo "mm/dd,2018/01/22 00:00:01" | awk -F"," 'gsub("/"," ")'
mm dd,2018 01 22 00:00:01
操作3:将第2和第3个“/”替换成空格,第1个“/”不变
$ echo "mm/dd,2018/01/22 00:00:01" | awk -F"," 'gsub("/"," ",$2)'
mm/dd 2018 01 22 00:00:01
问题来了,dd后面的“,”分隔符没有了,因为这里的替换是针对字段进行的,字段内容发生了变化,意味着需要重新设定输出分隔符OFS。
$ echo "mm/dd,2018/01/22 00:00:01" | awk -F"," -v OFS="," 'gsub("/"," ",$2)'
mm/dd,2018 01 22 00:00:01
操作4:如果只需第2个“/”替换成空格,第1个和第3个“/”不变
$ echo "mm/dd,2018/01/22 00:00:01" | awk -F"," -v OFS="," 'sub("/"," ",$2)'
mm/dd,2018 01/22 00:00:01
2 sub和gsub的区别
sub匹配第一次出现的符合模式的字符串,相当于 sed 's//'
sub函数匹配指定域/记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。
格式如下:
- sub (regular expression, substitution string)
- sub (regular expression, substitution string, target string)
gsub匹配所有的符合模式的字符串,相当于 sed 's//g'
gsub函数作用跟sub类似,但它会替换所有匹配值
格式如下:
- gsub (regular expression, substitution string)
- gsub (regular expression, substitution string, target string)
另外, 只有针对字段进行替换的时候 ,指定0FS变量才有用, 如果不指定字段,对整条记录进行替换,不需要指定OFS。