sed (function Argument) 大全!

红薯 发布于 2009/05/06 11:31
阅读 324
收藏 0

各位大家好!偶是一个新人,学习shell基本上通过通读论坛上高手的贴子来前进的。在学习的过程也遇到过很多问题,每每苦恼中总能得到CU上XDJM的耐心指点。关于wingger 同志发表了shell基础十二篇让某好生欢喜,但是在学习sed命令时,发现论坛上依然有很多朋友对于一些sed (function Argument)难于理解,自己刚开始也是这样,总结了一下原因,主要觉得还是没有非常系统的
资料和好的sample来参照理解。所以某家这几天在网上仔细的查了一下,收集了一份非常详细的sed (function Argument)还带例子有很多都是《inux与unix shell编程指南》所有没涉及到的东东,分享给大家,希望对大家有所帮助。学习经验、心得只有通过分享才能共同进步呀!
繁体!
----------------------------------------------------------------------------------------
介紹函數參數 

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.../(x、y、z、a、b、c 代表某些字元) 為 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



[ 本帖最后由 mocou 于 2005-12-21 20:42 编辑 ]



加载中
返回顶部
顶部