sed 命令詳解

介紹函數參數

 

介紹函數參數

   本章將以一節一個函數參數的方式 ,介紹所有 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]

 

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

函數參數 s 最多與兩個地址參數配合。

關於 "s/pattern/replacement/[flag]"(批註[12]) 有下面幾點說明:

pattern : 它爲 reguler expression 字符串。它表示文件中要被替換的字符串。

replacement : 它爲一般字符串。但其內出現下列字符有特別意義 :

 

& : 代表其前 pattern 字符串。例如

sed -e 's/test/& my car/' 資料文件名   

指令中 , & 代表 pattern 字符串 "test"。故執行後 , 數據文件的 "test" 被替換成 "test my car"

/n : 代表 pattern 中被第 n /( /)(參照[附錄 A]) 所括起來的字符串。例如

sed -e  's//(test/) /(my/) /(car/)/[/2 /3 /1]/' 資料文件名    

指令中 , /1 表示 "test"/2 表示 "my"/1 表示 "car" 字符串。故執行後 , 數據文件的 "test my car" 被替換成 "[my car test]"

/ : 可用它來還原一些特殊符號(如上述的 & / )本身字面上的意義 , 或用它來代表換行。

flag : 主要用它來控制一些替換情況 :

flag g , 代表替換所有符合(match)的字符串

flag 爲十進制數 m , 代表替換行內第 m 個符合的字符串。

flag p , 代表替換第一個符合 pattern 的字符串後 , 將數據輸出標準輸出文件。

flag w wfile , 代表替換第一個符合 pattern 的字符串後 , 輸出到 wfile 檔內(如果 wfile 不存在 , 則會重新開啓名爲 wfile 的檔案)

當沒有 flag , 則將資料行內第一個符合 pattern 的字符串以 replacement 字符串來替換

delimiter : "/pattern/replace/[flag] " "/" 被當成一 delimiter。除了空白(blank)、換行(newline) 之外 , 使用者可用任何字符作爲 delimiter。例如下述編輯指令

        s#/usr#/usr1#g

上述命令中 /verb|#| delimiter。如果用 "/" delimiter , sed 會將 pattern replacement 中的 "/" 當成 delimiter 而發生錯誤。

範例:

題目 : 替換 input.dat (後面如果沒有特別指定 , 均假設文件檔名爲 input.dat) "1996" 字符串成 "1997" , 同時將這些數據行存入 year97.dat 檔內。

說明 : 用函數參數 s 指示 sed "1996" 字符串替換成 "1997" , 另外用 s argument 中的 flag w 指示 sed 將替換過的資料行存入 year97.dat 檔內。

sed 命令列:

sed -e 's/1996/1997/w year97.dat' input.dat

 

4.2 d

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

 

 

       [address1[ ,address2]] d

 

 

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

函數參數 d 最多與兩個地址參數配合。

sed 執行刪除動作情況如下 :

pattern space 內符合地址參數的數據刪除。

將下一筆資料讀進 pattern space

重新執行 sed script

範例 : 可參考 section 3.3

4.3 a

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

 

 

       [address1] a/        使用者所輸入的數據

 

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

 

函數參數 a 最多與一個地址參數配合。

函數參數 a 緊接着 "/" 字符用來表示此行結束 , 使用者所輸入的數據必須從下一行輸入。如果數據超過一行 , 則須在每行的結尾加入"/"

sed 執行添加動作情況如下 : pattern space 內數據輸出後 , sed 跟着輸出使用者所輸入的數據。

範例 :

題目: 添加 "多任務操作系統" 在含 "UNIX" 字符串的數據行後。假設 input.dat 檔的內容如下 :

UNIX

說明: 用函數參數 a 將所輸入的數據添加在含 "UNIX" 字符串的數據行後。

sed 命令列如下 :

sed -e '/UNIX/a/

多任務操作系統

' input.dat

執行上述命令後 , 其輸出結果如下 :

UNIX

多任務操作系統

4.4 i

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

 

       [address1] i/        使用者所輸入的數據

 

 

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

函數參數 i 最多與一個地址參數配合。

函數參數 i 緊接着 "/" 字符用來表示此行結束 , 使用者所輸入的數據必須從下一行輸入。如果數據超過一行 , 則須在每行的結尾加入"/"

sed 執行插入動作的情況如下 : pattern space 內數據輸出前 , sed 先輸出使用者所輸入的數據。

範例 :

題目: "文章版權屬於中央研究院" 插在 input.dat 檔中含 "院長 : 李遠哲" 的數據行之前。假設 input.dat 檔內容如下 :

院長 : 李遠哲

說明: 用函數參數 i 將數據行 "文章版權屬於中央研究院" 插在含 "院長 : 李遠哲" 的數據行之前。

sed 命令列如下:

sed -e '/院長 : 李遠哲/i/

文章版權屬於中央研究院

' input.dat

執行上述命令後的輸出如下 :

文章版權屬於中央研究院

院長 : 李遠哲

4.5 c

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

 

     [address1[ ,address2]]c/      使用者所輸入的數據

 

 

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

函數參數 c 最多與兩個地址參數配合。

函數參數 c 緊接着 "/" 字符用來表示此行結束 , 使用者所輸入的數據必須從下一行輸入。如果數據超過一行 , 則須在每行的結尾加入"/"

sed 執行改變動作的情況 : pattern space 內數據輸出時 , sed 改變它成爲使用者所輸入的數據。

範例 : 參考 section 3.1 之例二、三。

4.6 p

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

 

     [address1[ , address2]] p

 

 

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

函數參數 p 最多與兩個地址參數配合。

sed 執行印出動作的情況如下 : sed 拷備一份 pattern space 內容至標準輸出檔。

範例 : 參考 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 它檔名稱

 

 

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

函數參數 r 最多與一個地址參數配合。

在指令中 , 函數參數 r 與它檔名稱間 , 只能有一空格。

sed 執行讀入動作的情況如下 : pattern space 內數據輸出後 , sed 讀出它檔的內容跟着輸出。當它檔不存在時 , sed 照樣執行其它指令而不會有任何錯誤訊息產生。

範例 : 參考 section 3.1 之例三。

4.9 w

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

 

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

 

 

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

函數參數 w 最多與兩個地址參數配合。

在指令中 , 函數參數 w 與它檔名稱間 , 只能有一空格。

sed 執行寫出動作的情況如 : pattern space 內資料寫到它文件內。數據寫入時 , 會取代(overwrite)原來檔案內的數據。另外 , 當它檔不存在時 , sed 會重新產生(creat)它。

範例:參考 section 3.1 之例二。

4.10 y

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

 

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

 

 

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

函數參數最多配合兩個地址參數。

指令中 , /abc.../xyz.../(xyzabc 代表某些字符) y argument 。其中 abc... xyz... 的字符個數必須相同。

sed 執行轉換時 , pattern space 內數據內的 a 字符轉換成 x 字符 b 字符轉換成 y 字符 c 字符轉換成 z 字符 ...

範例:

題目: input.dat 文件中的小寫字母改成大寫。假設 input.dat 檔的內容如下 :

Sodd's Second Law:

        Sooner or later, the worst possible set of

        circumstances is bound to occur.

說明:利用函數參數 y 指示 sed 做字母大小的轉換。

sed 命令列如下 :

 sed -e '

y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/

' input.dat

執行上述命令輸出結果如下 :

SODD'S SECOND LAW:

        SOONER OR LATER, THE WORST POSSIBLE SET OF

        CIRCUMSTANCES IS BOUND TO OCCUR.

4.11 !

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

 

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

 

 

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

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

4.12 n

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

 

     [address1[ ,address2]] n

 

 

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

函數參數 n 最多配合兩個地址參數。

sed 執行讀入下一行動作的情況如下 :

輸出在 pattern space 的數據。

將下一筆資料讀到 pattern space

執行下一個編輯指令。

範例(可與[section4.18]中的範例比較):

題目 : 輸出 input.dat 文件內偶數行資料。假設 input.dat 檔內容如下:

The

UNIX

Operation

System

說明: 在命令列上

以選項 -n , 將數據輸出的控制權(參照[section2.5])轉給指令。

利用函數參數 n 將下一行數據(偶數行)取代 pattern space 內的資料行(奇數行)

利用函數參數 p pattern space 內的數據(偶數行)輸出。

最後 , 整個輸出只有原先文件內的偶數行數據。

sed 命令列如下 :

sed -n -e 'n' -e 'p' infro.dat

執行上述命令後 , 輸出的結果如下 :

UNIX

System

4.13 q

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

 

     [address1] q

 

 

 

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

函數參數 q 最多配合一個地址參數。

sed 執行跳離動作時 , 它停止輸入 pattern space 數據 , 同時停止數據送到標準輸出文件。

範例 :

題目: 對文件文件執行 script_file 內的編輯指令 , 除非遇到 "Linux" 字符串。

說明: 無論 script_file 內是何種指令 , 使用者只要在命令列上用指令/Linux/q , 函數參數 q 會強迫 sed 遇到 "Linux" 時做跳離動作。

sed 命令列如下 :

sed -e '/Linux/q' -f script_file  input.dat

 

4.14 =

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

 

     [address1 ,[address2]] =

 

 

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

函數參數 = 最多配合兩個地址參數。

執行時 , 行數將在數據輸出前先輸出。

範例 :

題目: 印出 input.dat 文件內資料行數。假設 input.dat 的內容如下 :

The UNIX

Operating System

說明 : 用函數參數 = 來印出資料的行數。

sed 命令列如下 :

 sed -e '=' input.dat

執行上述命令後 , 輸出的結果如下 :

1

The UNIX

2

Operating System

4.15 #

script file , 函數參數 # 後的文字爲註解。當註解文字超過多行時 , 其行間須以 "/" 換行字符相隔。

 

4.16 N

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

 

     [address1 ,[address2]] N

 

 

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

函數參數 N 最多配合兩個地址參數。

sed 執行時 , 將下一行數據讀入並添加在 pattern space , 數據行間以換行字符(embedded newline character)分隔。此外 , 在替換時 , 換行字符可用 /n match

範例 :

題目: 將下述兩行數據合併。假設 input.dat 的內容如下 :

The UNIX

Operating System

說明 : 先利用函數參數 N 將兩行數據置於 pattern space , 在利用函數參數 s//n/ / 將兩行數據間的分隔號 /n 以空白替代 , 如此兩行數據變成一行輸出。

sed 命令列如下 :

 sed -e 'N' -e 's//n/ /' input.dat

執行上述命令後 , 其輸出的結果如下:

The UNIX Operating System

4.17 D

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

 

     [address1,address2]D

 

 

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

函數參數 D 最多配合兩個地址參數。

函數參數 D d 的比較如下 :

pattern space 內只有一數據行時 , D d 作用相同。

pattern space 內有多行資料行時

D 表示只刪除 pattern space 內第一行資料 ; d 則全刪除。

D 表示執行刪除後 , pattern space 內不添加下一筆數據 , 而將剩下的數據重新執行 sed script ; d 則讀入下一行後執行 sed script

範例 : 參考 section 3.3 的第二個例子。

4.18 P

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

 

     [address1,address2] P

 

 

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

函數參數 P 最多配合兩個地址參數。

P p , 除了面對的 pattern space 內的數據行數不同外 , 其它均相同。

範例(可與[section4.12]中的範例):

題目 : 輸出 input.dat 文件內奇數行資料。假設 input.dat 檔內容如下:

The

UNIX

System

說明: 在命令列上

以選項 -n , 將數據輸出的控制權(參照[section2.5])轉給指令。

利用函數參數 N 將偶數行添加至 pattern space 內奇數行後。

利用函數參數 P pattern space 內的第一行(奇數行)輸出。

在奇數行輸出後 , pattern space 內剩下的數據行(偶數行)則被放棄輸出。最後 , 整個輸出只有原先的奇數行數據。

sed 命令列 :

sed -n -e 'N' -e 'P' infro.dat

執行上述命令後 , 輸出的結果如下 :

The

System

4.19 h

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

 

     [address1 ,[address2]] h

 

 

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

函數參數 h 最多配合兩個地址參數。

sed 執行暫存動作時 , 會蓋掉(overwrite) hold space 內原來的數據。

sed 全部執行結束時 , hold space 內數據會自動清除。

範例 :參考 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

 

 

函數參數 g 最多配合兩個地址參數。

sed 執行放回動作時 , 數據蓋掉(overwrite)(批註[13]) pattern space 內原來的數據。

例題 :參考 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 結構。

範例 :

題目: input.dat 文件內數據行的開頭字母重複印 40 次。假設 input.dat 檔的內容如下 :

 

A

B

C

說明: 用指令 b p1 :p1 構成執行增加字母的循環(loop) , 同時在字母出現 40 個時 , 也用指令 b 來跳出循環。下面就以文件內第一行數據 "A" 爲例 , 描述它如何連續多添加 39 "A" 在同一行:

用指令 s/A/AA/(參照 section4.1) "A" 替換成 "AA"

用指令 b p1 :p1 構成循環(loop) , 它目的使上述動作被反覆的執行。每執行一次循環 , 則數據行上的 "A" 就多出一個。例如 , 第一次循環數據行變成 "AA" , 第二次循環資料行變成 "AAA" ...

用指令 [ABC]/{40/}/b(批註[15]) 來作爲停止循環的條件。當數據行有連續 40 A 出現時 , 函數參數 b 將執行的指令跳到最後 , 停止對此行的編輯。

同樣 , 對其它數據行也如同上述的方式執行。

sed 命令列如下 :

sed -e '{

:p1

/A/s/A/AA/

/B/s/B/BB/

/C/s/C/CC/

/[ABC]/{40/}/b

b p1

}' input.dat

4.25 t

基本上 , 函數參數 t 函數參數 b 的功能類似 , 除了在執行 t branch , 會先去測試其前的替換指令有沒有執行替換成功外。在 script file 內的情況如下:

                   .

                   .

                   .

              編輯指令m1

              :記號

              編輯指令m2

                   .

                   .

                   .

              s/.../.../

              [address1,[address2]]t [記號]

              編輯指令m3

其中 , 與函數參數 b 不同處在於 , 執行函數參數 t branch , 會先檢查其前一個替換指令成功與否。如成功 , 則執行 branch ; 不成功 , 則不 branch , 而繼續執行下一個編輯指令 , 例如上面的編輯指令m3

範例:

題目 : input.dat 文件中資料 A1 替換成 C1C1 替換成 B1B1 替換成 A1input.dat 檔的內容如下:

代號

 B1

 A1

 B1

 C1

 A1

 C1

說明 : input.dat 文件中全部數據行只需要執行一次替換動作 , 但爲避免數據被替換多次 , 所以利用函數參數 t sed script 內形成一類似 C 語言中 case statement 結構 , 使每行數據替換一次後能立即用函數參數 t 跳離替換編輯。

sed 命令列 :

sed -e '{

s/A1/C1/

t

s/C1/B1/

t

s/B1/A1/

t

}' input.dat

 

 

 

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