1 簡(jiǎn)單例子
通常對(duì)字符串的替換用sed的情況比較多,但是有時(shí)需要將字符串分成字段后,對(duì)某個(gè)字段進(jìn)行替換操作,這時(shí)就需要用awk的內(nèi)置字符串函數(shù)sub或gsub實(shí)現(xiàn)。
下面是樣本字符串:
mm/dd,2018/01/22 00:00:01
操作1:將第一個(gè)“/”替換成空格,后面的“/”不變
$ 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個(gè)“/”替換成空格,第1個(gè)“/”不變
$ echo "mm/dd,2018/01/22 00:00:01" | awk -F"," 'gsub("/"," ",$2)'
mm/dd 2018 01 22 00:00:01
問(wèn)題來(lái)了,dd后面的“,”分隔符沒(méi)有了,因?yàn)檫@里的替換是針對(duì)字段進(jìn)行的,字段內(nèi)容發(fā)生了變化,意味著需要重新設(shè)定輸出分隔符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個(gè)“/”替換成空格,第1個(gè)和第3個(gè)“/”不變
$ 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的區(qū)別
sub匹配第一次出現(xiàn)的符合模式的字符串,相當(dāng)于 sed 's//'
sub函數(shù)匹配指定域/記錄中最大、最靠左邊的子字符串的正則表達(dá)式,并用替換字符串替換這些字符串。如果沒(méi)有指定目標(biāo)字符串就默認(rèn)使用整個(gè)記錄。替換只發(fā)生在第一次匹配的時(shí)候。
格式如下:
- sub (regular expression, substitution string)
- sub (regular expression, substitution string, target string)
gsub匹配所有的符合模式的字符串,相當(dāng)于 sed 's//g'
gsub函數(shù)作用跟sub類(lèi)似,但它會(huì)替換所有匹配值
格式如下:
- gsub (regular expression, substitution string)
- gsub (regular expression, substitution string, target string)
另外, 只有針對(duì)字段進(jìn)行替換的時(shí)候 ,指定0FS變量才有用, 如果不指定字段,對(duì)整條記錄進(jìn)行替換,不需要指定OFS。