sed 與正規表示法

  1. sed 配合正規表示法進行搜尋 sed -n '/pattern/=' filename,-n 選項只列印行號,不列印檔案內容。
    [dywang@dywmac zzz]$ grep -n '[nb]zip' /etc/man.config 
    136:.gz		/usr/bin/gunzip -c
    137:.bz2		/usr/bin/bzip2 -c -d
    [dywang@dywmac zzz]$ sed -n '/[nb]zip/=' /etc/man.config 
    136
    137
    
  2. sed 配合正規表示法刪除一整行 sed -n '/pattern/d' filename,刪除 ssh 遠端連線紀錄檔中 IP 為 192.168.122.0/24 的紀錄,sed 沒有加 -i 選項不會真的刪除檔案中的內容,只是螢幕輸出中刪除。
    [dywang@dywmac ~]$ sed '/192\.168\.122\.[0-9]\{1,3\}/d' .ssh/known_hosts \
     | grep 192.168.122 --color
    
  3. 群組字串的取代:找到 \(patternN\),可用 \N 將其放置取代結果。
    sed 's/\(pattern1\)...\(pattern2\)/\2\1/g'
    [dywang@dywmac zzz]$ echo 'AxB' | sed 's/\([A-Z]\)x\([A-Z]\)/\2--\1/g'
    B--A
    [dywang@dywmac zzz]$ echo 'DxU' | sed 's/\([A-Z]\)x\([A-Z]\)/\2--\1/g'
    U--D
    
  4. 加減乘除符號 + - * / 的取代,使用雙引號時,減號要使用兩個反斜線跳脫。
    [dywang@deyu moodle]$ echo '+-*/+-*/' | sed "s/\([+\\-*/]\)/\1A/g"
    sed: -e expression #1, char 19: Invalid range end
    [dywang@deyu moodle]$ echo '+-*/+-*/' | sed "s/\([+*/\\-]\)/\1A/g"
    +A-A*A/A+A-A*A/A
    
  5. 加減乘除符號 + - * / 的取代,使用單引號時,減號就可以使用一個反斜線跳脫。
    [dywang@dywIssd zzz]$ echo '+-*/+-*/' | sed 's/\([+*/\\-]\)/\1A/g'
    +A-A*A/A+A-A*A/A
    [dywang@dywIssd zzz]$ echo '+-*/+-*/' | sed 's/\([+*/\-]\)/\1A/g'
    +A-A*A/A+A-A*A/A
    
  6. (a,b,x) 取代成 axb=
    [dywang@dywmac zzz]$ echo '(23,10,+)' | sed 's|(\([0-9]*\),\([0-9]*\),\([+*/\-]\))|\1\3\2=|g'
    23+10=