chapter4

介紹函數參數


介紹函數參數

   本章將以一節一個函數參數的方式 ,介紹所有 sed 提供的函數參數 , 其中有

| s | d | a | i | c | p | l | r | w | y | ! | n | q | = | # | N | D | P | h | H | g | G | x | b | t |

另外 , 在各節中 , 首先簡單介紹函數參數功能 , 接著說明函數參數與位址參數配合的格式 , 而其中也一併描述 sed 執行此函數參數的工作情形。

4.1 s

   函數參數 s 表示替換(substitute)文件內字串。其指令格式如下 :
[address1[ ,address2]] s/pattern/replacemen/[flag]

對上述格式有下面幾點說明 :

  1. 函數參數 s 最多與兩個位址參數配合。
  2. 關於 "s/pattern/replacement/[flag]"(註解[12]) 有下面幾點說明:
  3. 範例:

4.2 d

函數參數 d 表示刪除資料行 , 其指令格式如下:


       [address1[ ,address2]] d


對上述格式有下面幾點說明:

  1. 函數參數 d 最多與兩個位址參數配合。
  2. sed 執行刪除動作情況如下 :
    1. 將 pattern space 內符合位址參數的資料刪除。
    2. 將下一筆資料讀進 pattern space 。
    3. 重新執行 sed script。
  3. 範例 : 可參考 section 3.3。

4.3 a

函數參數 a 表示將資料添加到文件中。其指令格式如下:

       [address1] a\        使用者所輸入的資料

對上述格式有下面幾點說明:

  1. 函數參數 a 最多與一個位址參數配合。
  2. 函數參數 a 緊接著 "\" 字元用來表示此行結束 , 使用者所輸入的資料必須從下一行輸入。如果資料超過一行 , 則須在每行的結尾加入"\"。
  3. sed 執行添加動作情況如下 : 當 pattern space 內資料輸出後 , sed 跟著輸出使用者所輸入的資料。
  4. 範例 :

4.4 i

函數參數 i 表示將資料插入文件中。其指令格式如下:

       [address1] i\        使用者所輸入的資料


對上述格式有下面幾點說明:

  1. 函數參數 i 最多與一個位址參數配合。
  2. 函數參數 i 緊接著 "\" 字元用來表示此行結束 , 使用者所輸入的資料必須從下一行輸入。如果資料超過一行 , 則須在每行的結尾加入"\"。
  3. sed 執行插入動作的情況如下 : 在 pattern space 內資料輸出前 , sed 先輸出使用者所輸入的資料。
  4. 範例 :

4.5 c

函數參數 c 表示改變文件中的資料。其格式如下:

     [address1[ ,address2]]c\      使用者所輸入的資料


對上述格式有下面幾點說明:

4.6 p

函數參數 p 表示印出資料。其指令格式如下 :

     [address1[ , address2]] p


對於上述格式有下面幾點說明 :

  1. 函數參數 p 最多與兩個位址參數配合。
  2. sed 執行印出動作的情況如下 : sed 拷備一份 pattern space 內容至標準輸出檔。
  3. 範例 : 參考 section 3.4 開頭的內容。

4.7 l

函數參數 l , 除可將資料中的 nonprinting character 以 ASCII碼列出外 , 其於均與函數參數 p 相同。例如 , 將下面 input.dat 檔中的 ^[ 以 ASCII 碼印出

The Great ^[ is a movie starring Steve McQueen.
執行命令 sed -e 'l' input.dat 後 , 則輸出結果如下 :
The Great \003 is a movie starring Steve McQueen.
The Great     is a movie starring Steve McQueen.
上述第二行資料為 sed 的自動輸出(請參照註解[]。

4.8 r

函數參數 r 表示讀入它檔案內容到文件中。其指令格式如下 :

       [address1] r 它檔名稱


對於上述格式有下面幾點說明 :

  1. 函數參數 r 最多與一個位址參數配合。
  2. 在指令中 , 函數參數 r 與它檔名稱間 , 只能有一空格。
  3. sed 執行讀入動作的情況如下 : 在 pattern space 內資料輸出後 , sed 讀出它檔的內容跟著輸出。當它檔不存在時 , sed 照樣執行其它指令而不會有任何錯誤訊息產生。
  4. 範例 : 參考 section 3.1 之例三。

4.9 w

函數參數 w 表示將文件中的寫到它檔內。其指令格式如下 :

     [address1[ ,address2]] w 它檔名稱


對於上述格式有下面幾點說明 :

  1. 函數參數 w 最多與兩個位址參數配合。
  2. 在指令中 , 函數參數 w 與它檔名稱間 , 只能有一空格。
  3. sed 執行寫出動作的情況如 : 將 pattern space 內資料寫到它檔內。資料寫入時 , 會取代(overwrite)原來檔案內的資料。另外 , 當它檔不存在時 , sed 會重新產生(creat)它。
  4. 範例:參考 section 3.1 之例二。

4.10 y

函數參數 y 表示轉換資料中的字元。其指令格式如下 :

     [address1[ ,address2]]y /xyz.../abc.../


對於上述格式有下面幾點說明 :

  1. 函數參數最多配合兩個位址參數。
  2. 指令中 , /abc.../xyz.../(x、y、z、a、b、c 代表某些字元) 為 y 的 argument 。其中 abc... 與 xyz... 的字元個數必須相同。
  3. sed 執行轉換時 , 將 pattern space 內資料內的 a 字元轉換成 x 字元 、b 字元轉換成 y 字元 、c 字元轉換成 z 字元 ...。
  4. 範例:

4.11 !

函數參數 ! 表示不執行函數參數。當有如下指令時 ,

     [address1[ , address2]] ! 函數參數


表示 , 對符合位址參數之資料不執行函數參數。例如刪除 , 除了含 "1996" 字串 , 所有資料行 , 則執行如下命令

sed -e '/1996/!d' input.dat

4.12 n

函數參數 n 表示讀入下一行資料。其指令格式如下:

     [address1[ ,address2]] n


對上述格式有下面幾點說明 :

  1. 函數參數 n 最多配合兩個位址參數。
  2. sed 執行讀入下一行動作的情況如下 :
    1. 輸出在 pattern space 的資料。
    2. 將下一筆資料讀到 pattern space。
    3. 執行下一個編輯指令。
  3. 範例(可與[section4.18]中的範例比較):

4.13 q

函數參數 q 表示跳離 sed 。其指令格式如下:

     [address1] q


對上述格式有下面幾點說明 :

  1. 函數參數 q 最多配合一個位址參數。
  2. sed 執行跳離動作時 , 它停止輸入 pattern space 資料 , 同時停止資料送到標準輸出檔。
  3. 範例 :

4.14 =

函數參數 = 表示印出資料的行數。其指令格式如下:

     [address1 ,[address2]] =


對上述格式有下面幾點說明 :

  1. 函數參數 = 最多配合兩個位址參數。
  2. 執行時 , 行數將在資料輸出前先輸出。
  3. 範例 :

4.15 #

在 script file 內 , 函數參數 # 後的文字為注解。當注解文字超過多行時 , 其行間須以 "\" 換行字元相隔。

4.16 N

函數參數 N 表示添加下一筆資料在 pattern space 內。其指令格式如下:

     [address1 ,[address2]] N


對上述格式有下面幾點說明 :

  1. 函數參數 N 最多配合兩個位址參數。
  2. sed 執行時 , 將下一行資料讀入並添加在 pattern space 內 , 資料行間以換行字元(embedded newline character)分隔。此外 , 在替換時 , 換行字元可用 \n 來 match。
  3. 範例 :

4.17 D

函數參數 D 表示刪除 pattern space 內的第一行資料。其指令格式如下:

     [address1,address2]D


對上述格式有下面幾點說明 :

  1. 函數參數 D 最多配合兩個位址參數。
  2. 函數參數 D 與 d 的比較如下 :
    1. 當 pattern space 內只有一資料行時 , D 與 d 作用相同。
    2. 當 pattern space 內有多行資料行時
      1. D 表示只刪除 pattern space 內第一行資料 ; d 則全刪除。
      2. D 表示執行刪除後 , pattern space 內不添加下一筆資料 , 而將剩下的資料重新執行 sed script ; d 則讀入下一行後執行 sed script。
  3. 範例 : 參考 section 3.3 的第二個例子。

4.18 P

函數參數 P 表示印出 pattern space 內的第一行資料。其指令格式如下:

     [address1,address2] P


對上述格式有下面幾點說明 :

  1. 函數參數 P 最多配合兩個位址參數。
  2. P 與 p , 除了面對的 pattern space 內的資料行數不同外 , 其它均相同。
  3. 範例(可與[section4.12]中的範例):

4.19 h

函數參數 h 表示暫存 pattern space 的資料至 hold space。其指令格式如下:

     [address1 ,[address2]] h


對上述格式有下面幾點說明 :

  1. 函數參數 h 最多配合兩個位址參數。
  2. sed 執行暫存動作時 , 會蓋掉(overwrite) hold space 內原來的資料。
  3. 當 sed 全部執行結束時 , hold space 內資料會自動清除。
  4. 範例 :參考 section 3.4 的例子。

4.20 H

函數參數 H 與 h 唯一差別是 , sed 執行 h 時 , 資料蓋掉(overwrite) hold space 內原來的資料 , 而 H , 資料則是 "添加(append)" 在 hold space 原來資料後。例題請參考 section 3.2 之例一。

4.21 g

   函數參數 g 表示與函數參數 h 相反的動作 , 它表示將 hold space 內資料放回 pattern space 內。其指令格式如下 :

     [address1,address2]g


  1. 函數參數 g 最多配合兩個位址參數。
  2. sed 執行放回動作時 , 資料蓋掉(overwrite)(註解[13]) pattern space 內原來的資料。
  3. 例題 :參考 section 3.4 的例子。

4.22 G

函數參數 G 與 g 唯一差別是 , sed 執行 g 時 , 資料蓋掉(overwrite) pattern space 內原來的資料 , 而 G , 資料則是 "添加(append)" 在 pattern space 原來資料後。例子請參考 section 3.2 例一。

4.23 x

   函數參數 x 表示交換 hold space 與 pattern space 內的資料。其指令格式如下 :

     [address1 ,[address2]] x


函數參數 x 大部份與其它處理 hold space 的函數參數一起配合。例如 , 將 input.dat 檔內第 1 行資料取代第 3 行資料。此時 , 用函數參數 h 與 x 來配合。其中 , 以函數參數 h 將第 1 資料存入 hold space ; 當第 3 行資料出現在 pattern space , 以函數參數 x 交換 hold space 與 pattern space 的內容。如此 , 第 3 行資料就被第 1 資料替代。其命令列如下:

sed -e '1h' -e '3x' input.dat

4.24 b、:label

函數參數 : 與函數參數 b 可在 sed script 內建立類似 BASIC 語言中 GOTO 指令的功能。其中 , 函數參數 : 建立標記;函數參數 b 將下一個執行的指令 branch 到標記處執行。函數參數 : 與 b , 在 script file 內配合的情況如下
    
                   .
                   .
                   .
              編輯指令m1
              :記號
              編輯指令m2
                   .
                   .
                   .               
              [address1,[address2]]b [記號]                  
其中 , 當 sed 執行至指令 [address1,[address2]]b [記號] 時 , 如 pattern space 內的資料符合位址參數 , 則 sed 將下一個執行的位置 branch 至由 :記號(註解[14])設定的標記處 , 也就是再由 "編輯指令m2" ... 執行。另外 , 如果指令中函數參數 b 後沒有記號 , 則 sed 將下一個執行的指令 branch 到 script file 的最後 , 利用此可使 sed script 內有類似 C 語言中的 case statement 結構。
範例 :

4.25 t

基本上 , 函數參數 t 與 函數參數 b 的功能類似 , 除了在執行 t 的 branch 前 , 會先去測試其前的替換指令有沒有執行替換成功外。在 script file 內的情況如下:
                   .
                   .
                   .
              編輯指令m1
              :記號
              編輯指令m2
                   .
                   .
                   .
              s/.../.../
              [address1,[address2]]t [記號]
              編輯指令m3
其中 , 與函數參數 b 不同處在於 , 執行函數參數 t branch 時 , 會先檢查其前一個替換指令成功與否。如成功 , 則執行 branch ; 不成功 , 則不 branch , 而繼續執行下一個編輯指令 , 例如上面的編輯指令m3。
範例:


[Table Of Contents][chapter3]