awk实战4-分字段内容的替换

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。

你可能感兴趣的:(awk实战4-分字段内容的替换)