chapter3

3.範例


3.範例

   一般在實際使用編輯器的過程中 , 常需要執行替換文件中的字串、搬移、刪除、與搜尋資料行等等動作。當然 , 一般交談式編輯器(如 vi、emacs)都能做得到上述功能 , 但文件一旦有大量上述編輯需求時 , 則用它們編輯十分沒有效率。本章將用舉例的方式說明如何用 sed 自動執行這些編輯功能。此外 , 在本章範例中 , 均以下述方式描述文件的需求 :
            將文件中...資料 , 執行...(動作)
如此 , 目的是為了能將它們迅速的轉成編輯指令。其中 , " ...資料" 部份 , 轉成指令中的位址參數表示 ; "執行...動作" 部份 , 則轉成函數參數表示 。另外 , 當 "執行...動作" 要由數個函數參數表示時 , 則可利用 "{ "與 " }" 集合這些函數參數(註解[9]) , 其指令形式如下 :
         位址參數{
                 函數參數1
                 函數參數2
                 函數參數3
                     .
                     :
                  }
上述指令表示 , 將對符合位址參數的資料 , 依次執行函數參數1、函數參數2、函數參數3 ... 表示的動作。下面各節 , 分別舉例說明 sed 替換資料、移動、刪除資料、及搜尋資料的命令。

3.1 替換文件中的資料

   Sed 可替換文件中的字串、資料行、甚至資料區。其中 , 表示替換字串的指令中的函數參數為 s(參照[section4.1]); 表示替換資料行、或資料區的指令中的函數參數為 c(參照[section4.5])。上述情況以下面三個例子說明。上述情況以下面三個例子說明。

3.2 搬動文件中的資料

   使用者可用 sed 中的 hold space 暫存編輯中的資料、用函數參數 w(參照[section4.9])將文件資料搬動到它檔內儲存、或用函數參數 r(參照[section4.8])將它檔內容搬到文件內。Hold space 是 sed 用來暫存 pattern space 內資料的暫存器 , 當 sed 執行函數參數 h、H(參照[section4.19])時 , 會將 pattern space 資料暫存到 hold space;當執行函數參數 x、g、G(參照[section4.22])時 , 會將暫存的資料取到 pattern space 。下面舉三個例子說明。 另外 , 由於 sed 是一 stream(參照[section1.4])編輯器 , 故理論上輸出後的文件資料不可能再搬回來編輯。

3.3 刪除文件中的資料

   因為 sed 是一行編輯器 , 所以 sed 很容易刪除個別資料行或整個資料區。一般用函數參數 d(參照[section4.2])或 D(參照[section4.17]) 來表示。下面舉兩個例子說明。

3.4 搜尋文件中的資料

   Sed 可以執行類似 UNIX 命令 grep 的功能。理論上 , 可用 regular expression(參照[附錄 A])。例如 , 將文件中含有 "gamma" 字串的資料行輸出。則其命令列如下:
                 sed -n -e '/gamma/p' 文件檔
   但是 , sed 是行編輯器 , 它的搜尋基本上是以一行為單位。因此 , 當一些字串因換行而被拆成兩部份時 , 一般的方法即不可行。此時 , 就必須以合併兩行的方式來搜尋這些資料。其情況如下面例子:

例. 將文件中含 "omega" 字串的資料輸出。其命令列如下

sed -f gp.scr 文件檔
gp.scr 檔的內容如下 :
/omega/b
N
h
s/.*\n//
/omega/b
g
D
在上述 sed script(註解[10]), 因藉著函數參數 b 形成類似 C 語言中的 case statement 結構 , 使得 sed 可分別處理當資料內含 "omega" 字串 ; 當 "omega" 字串被拆成兩行 ; 以及資料內沒有"omega" 字串的情況。接下來就依上述的三種情況 , 將 sed script 分成下面三部份來討論。
  1. 當資料內含 "omega" , 則執行編輯指令
    /omega/b
    
    它表示當資料內含 "omega" 字串時 , sed 不用再對它執行後面的指令 , 而直接將它輸出。
  2. 當資料內沒有"omega" , 則執行編輯指令如下
    N
    h
    s/.*\n//
    /omega/b
    
    其中 , 函數參數 N(參照[section 4.16]) , 它表示將下一行資料讀入使得 pattern space 內含前後兩行資料 。函數參數 h(參照[section 4.19]) , 它表示將 pattern space 內的前後兩行資料存入 hold space 。函數參數 s/.*\n// , 它表示將 pattern space 內的前後兩行資料合併(註解[11])成一行。/omega/b , 它表示如果合併後的資料內含 "omega" 字串 , 則不用再執行它之後的指令 , 而將此資料自動輸出 ;

  3. 當合併後的資料依舊不含 "omega" , 則執行編輯指令如下
    g
    D
    
    其中 , 函數參數 g(參照[section4.21]) , 它表示將 hold space 內合併前的兩行資料放回 pattern space。 函數參數 D(參照[section4.17]) , 它表示刪除兩行資料中的第一行資料 , 並讓剩下的那行資料 , 重新執行 sed script。如此 , 無論的資料行內或行間的字串才可搜尋完全。


[Table Of Contents][chapter2][chapter4]