sed 語法深入

sed 流編輯器(流編輯器可以對從管道這樣的標準輸入接收到的數據進行編輯.)
     -sed 是基於行的,按順序對每一行執行命令。
     -sed 處理數據時,將一行讀入其模式緩衝區,執行編輯命令,再打印模式緩衝區。然後它對後面的每一行重複這些步驟。
     -再次強調,sed是基於行的,逐行處理數據

基本操作:
     sed -e '5d'  // 刪除第5行,其他行輸出
        工作地址:  5 第五行
        執行的命令: d 刪除操作
     sed -e '5,10d' // 刪除5到10行 
        
利用正則指定地址範圍:  將正則表達式用兩個斜槓/擴起來,指定一種模式,後面緊跟一條命令來處理與該模式匹配的行。習慣將命令用單引號擴起來比較好!
    
  1. sed  -e '/正則表達式/command'

    常見的命令: d 刪除命令
               p 打印命令
     -e 使用腳本 -n(安靜模式,不私自輸出)與命令p搭配,輸出指定模式的行
eg.
  1.  sed -e -n '/regexp/p'   # regexp就是正則表達式

使用兩個用逗號分開的正則表達式,指定一個範圍:
    sed -e '/Begin/,/End/command'
類似於 '1,5/p' ,只不過這裏的起始和結束都是正則表達式,需要用//擴起來。
  eg. 
  1.     sed -n -e '/main[[:space:]]*(/ , /^}/p' /tmp/main.c
   // [[:space:]]是posix字符集,用來表示所有空白字符(製表符、空格、新的行),加上*後,表示main和(之間有0個或多個空白.
 // 這個sed的起始匹配行:包含有 main ()或main()的行,結束匹配行:以 } 開頭的行 

替換:  's///'
         's///g' 
  s/// 表示替換  g告訴sed執行全局替換 !!!
    沒有g時只對第一個匹配項進行替換操作.
   常見命令:
      '1,10s///g' 對1-10行的所有匹配項執行替換命令
      '/Begin/,/End/s///g'  對Begin到End範圍內的所有匹配行執行替換命令
    當正則表達式或替換字符串有斜槓‘/’出現時可以使用其他字符替換斜槓.
       's///' <==> 's:::' <==> 's###' ...
sed中模式之間交換位置
    ()之間的模式(各段)將被保留在模式緩衝區,\n可以實現對前面()之間的模式的引用,n從1到9.
  sed -r 's/(段1)(段2)(段3)/\1\2\3/g'  默認從左到右 \1\2\3 
  sed -r  's/(段1)(段2)(段3)/\3\2\1/g'  將 第一段和第三段交換位置
  ...
sed某一行前新增一行  
   插入命令: i
      sed  -e '地址範圍i\string'  //string爲要追加的內容,不需要引號將string括起來
sed某一行後追加一行  
   追加命令:a      
       sed -e '地址範圍a\string'
sed 組合命令
  適合於: 需要將多個命令應用到同一行中
    指定多條命令時,sed會按順序將命令應用到每一行。
  
  (1) 使用分號分隔命令
    eg. sed -n -e '=;p'  /etc/passwd  // 第一個命令=告訴sed打印行號,第二個命令p告訴sed打印改行.
  (2) 爲每條命令使用一個 -e 參數
    sed -n -e '=' -e 'p' /etc/passwd  // -e指定的命令一次應用到每一行
  (3)命令太多時,將命令寫入文本文件中,通過 -f 參數引用命令,就不需要-e參數了
    sed命令腳本:
      handle.sed 
  1.      1d # 告訴sed刪除第一行
  2.      s#/sbin/nologin#/bash#g # 執行替換
  3.      p  # 告訴sed 打印該行
    再引用此文件:
     sed -n -f handle.sed /etc/passwd
  
sed 將多條命令應用到一個地址範圍 
   應用場景:對一個範圍內的所有行執行多條命令時
語法: 地址範圍{命令串}    //命令之間用(;)隔開.
   sed -e '/Begin/,/End/{命令1;命令2;命令3....}/' 
eg. 
   sed -n -e '1,5{s#/sbin/nologin#/bash#g ; s/:/|/g ; p}' /etc/passwd
     // 對/etc/passwd 中的1-5行依次執行 替換、再替換、打印.
 

sed 實際的例子:
  Unix和DOS/Windows系統純文本格式的換行方式是不同的。基於Dos/Winsows的文本文件在每一行末尾有一個CR(回車)和LF(換行),而Unix文本每一行結尾只有一個換行。有時需要在Unix和Windows之間互相使用同一個文本文件,Unix上bash只要一遇見回車就出問題。
  利用 sed 實現windows和Unix之間文本文件的互相轉換:
  Unix->Win:
  1.     sed -e 's/$/\r/g'  Myunix.txt > Mywin.txt # 在一行的末尾前插入回車

  Win->Unix:
  1.     sed -e 's/.$//g'  Mywin.txt > Myunix.txt # 將每行的最末字符回車刪除


sed正則: 
   sed中,爲了匹配特殊字符,必須將它用[::]擴起來!(類似posix字符集)
     - 比如: 要匹配行中的冒號‘:’,正則應這樣寫[:::],否則:就是一個普通的冒號.
     


總結: sed命令可分爲兩部分:

    第一部分:選定地址範圍。可以通過指定起始行和結束行來選定不分行,也可以通過匹配(正則)選定特定的範圍,這給程序帶來巨大的靈活性。
    第二部分:對地址範圍執行特定操作。常見的操作有替換(重要)、刪除(d)、打印(p)、插入(i)、追加(a)
    sed 命令可以組合,完成複雜的任務。甚至寫成腳本,定製想要的功能。
























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章