1. 程式人生 > >Linux基礎 ------- 文字處理利器sed

Linux基礎 ------- 文字處理利器sed

Linux文字處理利器 -- sed



Sed是UNIX/Linux系統上提供的將編輯工具自動化的編輯器,可以直接編輯檔案。Sed以行為編輯
單位(行編輯器)。相比vim,gedit等編輯工具,Sed編輯檔案只需要一條命名就可以解決很多的
問題,而且Sed對正則表示式的支援也非常好,的確是Linux下文字處理的利器。

1 使用方法

  1) sed OPTIONS... [SCRIPT] [INPUTFILE...]
           ---       ------------          -------------------   
            |           |                              |--------------被修改的檔案,如果沒有定義則結果會輸出到標準輸出中
            |           |-------------------------------------動作,定義sed具體的操作,通常為''或者""中的字串
            |----------------------------------------------sed命令選項
     

2 常用引數說明(OPTIONS) 

  -n        | --quiet    | --silent    : 只有經過處理的行才顯示在標準輸出中
  -e script | --expression= script     : 加入一個動作來處理,多個動作使用多個此引數
  -f script-file  | --file=script-file : 使用檔案中的sed動作
  -i[SUFFIX]      | --in-place[=SUFFIX]
: 直接修改檔案,而不輸出到螢幕上
  -r        | --regexp-extended        : 使用擴充套件的正則表示式

3 如何寫一個sed的動作(SCRIPT) -- ★重要★

  如何寫一個sed動作,簡單來講就是
  ①定位 --> 在文字中選到某行或者某幾行作為操作的範圍
  ②操作 --> 對上述選中的行進行操作(輸出、新增、刪除、修改)
  ③結果 --> 對上述操作的結果進行處理(輸出到螢幕、直接修改檔案)
 

3.1 如何選中行

    number     : 直接指定行數  ----> sed -n '2p' 指定第2行(p引數為輸出到螢幕,下同)
    first~step : 每step行中的第first行  ----> sed -n '1~2p' 每兩行中的第一行,即奇數行
    $          : 最後一行
    /regexp/   : 匹配此正則表示式的行   ----> sed -n '/Ruby/p' 匹配所有含有Ruby欄位的行
    addr1,+N   : addr1行和其後N行內容,'+'可以省略 ---->   sed -n '2,5p' 指定2到5行 
    addr1,~N   : addr1行和其後N的倍數行內容

3.2 如何進行操作 -- sed動作說明

   [n1[,n2]]   function
   function如以下的引數
    a  : 新增 --  選中行之後
    c  : 替換
    d  : 刪除
    i  : 插入 -- 選中行之前
    p  : 列印
    s  : 替換,通常搭配正則表示式  --> 5,10s/old/new/g 

3.3 關於sed的其他方面

   1) 如何在sed中使用shell的變數
      sed動作字串使用雙引號即可
      如 : 
      var="insert a line"
      sed "1a $var"

   
   2) sed的結果傳遞給shell

     var=`cat /etc/passwd | sed -n '2,5p'`


4 一些例子

  1) 新增

      sed -i '1a insert a line' test  -- test檔案第一行後新增
      sed -i '/test/a insert a line' tes  -- test檔案中含有test欄位的行後面增加一行

  2)刪除

      sed -i '2,5d' test  -- 刪除test檔案的2到5行內容
      sed -i '/test/d' test  -- 刪除test檔案中含有test欄位的行

  3)替換 ★重要★

     命令格式 : sed 's/要被替換的字串/新字串/g'
      sed -i 's/test/this is a replace/g' test -- 將test檔案中test欄位替換成成新的欄位 (替換字串)
      cat /etc/man.config | grep "MAN" | sed 's/^#.*$//g'  -- 刪除所以以#號開頭的註釋行 (刪掉整行)
      cat /etc/man.config | grep "MAN" | sed 's/^$//g'     -- 刪掉空白行
    捕獲
    sed -i 's/^test/&this is a new/' test    -- 在test字串後新增字串(&代表所有捕獲的字串)
    sed -i 's/^test\(.*\)$/\1this is a new/' test    -- 將test替換成this is a new '\1'代表'\(\)'括號裡面捕獲的字串,這裡的括號需要轉義

  4)命令組合,使用shell命令

    sed -i -e "s/^\(DEVICE=\).*$/\1eth1/g" -e "s/^\(HWADDR=\).*$/\1$(cat /sys/class/net/eth1/address)/g" /etc/sysconfig/network-scripts/ifcfg-eth1
    說明 : ①一個 -e 後接一個sed動作,多個 -e 接多個動作
           ②可以在sed動作中使用shell的命令 $(cat /sys/class/net/eth1/address),但是命令必須要在雙引號之間

  5)檔案讀寫 r 和 w

    sed '/test/r file' test --- file裡的內容被讀進來,顯示在與test匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。   
    sed -n '/test/w file' test --- 在test中所有包含test的行都被寫入file裡。

  6) 保持和互換:h命令和x命令      

    sed -e '/test/h' -e '/check/x' test --- 現將含有test欄位的行儲存在緩衝區當中(h命令),再將含有check欄位行替換成緩衝區的字串(x命令)。實際作用就是交換兩行的內容。

附錄:sed中的元字元(使用於正則表示式)
   ^      : 行開頭   
   $      : 行結束   
   .      : 任意非換行字元  
   *      : 零個或多個字元 如/.*/  
   []     : 匹配一個指定範圍內的字元,如/[Ss]ed/匹配sed和Sed。   
   [^]    : 不匹配指定範圍的字元,與[]相反   
   \(..\) : 捕獲組 
   &      : 儲存搜尋字元用來替換其他字元,如s/love/**&**/,love這成**love**。    
   \<     : 錨定單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行。    
   \>     : 錨定單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。    
   x\{m\} : 重複字元x,m次,如:/0\{5\}/匹配包含5個o的行。    
  x\{m,\} : 重複字元x,至少m次,如:/o\{5,\}/匹配至少有5個o的行。    
  x\{m,n\}: 重複字元x,至少m次,不多於n次,如:/o\{5,10\}/匹配5--10個o的行。