Next: 輸入輸出處理print(f)
Up: 其他函數
Previous: 其他函數
  Contents
字串上處理不像sed有s///這種代換,得用上一些內建函數。
- 傳回符合regex的在string的位置
match(string, regex)
- 傳回子字串: 傳回在第m個字元往後數n個字元的子字串,n沒給就到底
substr(string, m, [,n])
代換: 代換的幾個函數有的傳回值很特別
- 把string2裡面符合regex的第一個字串換成string1。成功傳回1。
sub(regex, string1, string2)
- 把string2裡面符合regex的字串globally的全部代換成string1,
等於sed的s///g。傳回整數表示代換數目。
gsub(regex, string1, string2)
- 傳回一個字串為string2裡面符合regex的第n個字串換成string1,
等於sed的s///nth_match。但是string2沒有被改變。
gensub(regex, string1, nth_match, string2)
string2沒給通通是$0,nth_match可以用g或G表示globally(全部)。請看例子
$ cat match.awk
#! /bin/awk
BEGIN{FS=":"}
/cyril/{
print $0
print match($0, /cyril/)
print substr($0, match($0, /cyril/), length("cyril"))
print gensub(/cyril/, "mark", 2)
print $0
sub(/^.*cyril/, "mark")
print $0
}
$ awk -f match.awk /etc/passwd
lcyril:x:100:1::/export/lcyril:/usr/bin/bash
2
cyril
lcyril:x:100:1::/export/lmark:/usr/bin/bash
lcyril:x:100:1::/export/lcyril:/usr/bin/bash
mark:/usr/bin/bash
這個例子用了length()這個函數,regex不用引號,有string的地方要用
double quote括起來,用gensub不會改變string2的值,
而且請看第三個print $0,這邊還是有greedy的效應在,所以只剩下後面一截。
Cyril Huang
2002-06-14