SED 手冊 - 4.介紹函式引數(轉)
SED 手冊 - 4.介紹函式引數(轉)[@more@]本章將以一節一個函式引數的方式 ,介紹所有 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"。
: 代表 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.dat4.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 03 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.dat4.12 n 函式引數 n 表示讀入下一行資料。其指令格式如下: [address1[ ,address2]] n 對上述格式有下面幾點說明 : 函式引數 n 最多配合兩個位址引數。 sed 執行讀入下一行動作的情況如下 : 輸出在 pattern space 的資料。 將下一筆資料讀到 pattern space。 執行下一個編輯指令。 例(可與[section4.18]中的例比較): 題目 : 輸出 input.dat 檔內偶數行資料。假設 input.dat 檔內容如下: TheUNIXOperationSystem說明: 在命令列上 以選項 -n , 將資料輸出的控制權(參照[section2.5])轉給指令。 利用函式引數 n 將下一行資料(偶數行)取代 pattern space 內的資料行(奇數行)。 利用函式引數 p 將 pattern space 內的資料(偶數行)輸出。 最後 , 整個輸出只有原先檔內的偶數行資料。 sed 命令列如下 : sed -n -e 'n' -e 'p' infro.dat執行上述命令後 , 輸出的結果如下 : UNIXSystem4.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.dat4.14 = 函式引數 = 表示印出資料的行數。其指令格式如下: [address1 ,[address2]] = 對上述格式有下面幾點說明 : 函式引數 = 最多配合兩個位址引數。 執行時 , 行數將在資料輸出前先輸出。 例 : 題目: 印出 input.dat 檔內資料行數。假設 input.dat 的內容如下 : The UNIXOperating System說明 : 用函式引數 = 來印出資料的行數。 sed 命令列如下 : sed -e '=' input.dat執行上述命令後 , 輸出的結果如下 : 1The UNIX2Operating System4.15 # 在 script file 內 , 函式引數 # 後的文字為註解。當註解文字超過多行時 , 其行間須以 "" 換行字元相隔。4.16 N 函式引數 N 表示新增下一筆資料在 pattern space 內。其指令格式如下: [address1 ,[address2]] N 對上述格式有下面幾點說明 : 函式引數 N 最多配合兩個位址引數。 sed 執行時 , 將下一行資料讀入並新增在 pattern space 內 , 資料行間以換行字元(embedded newline character)分隔。此外 , 在替換時 , 換行字元可用
來 match。 例 : 題目: 將下述兩行資料合。假設 input.dat 的內容如下 : The UNIXOperating System說明 : 先利用函式引數 N 將兩行資料置於 pattern space 內 , 在利用函式引數 s/
/ / 將兩行資料間的分隔號
以空白替代 , 如此兩行資料變成一行輸出。 sed 命令列如下 : sed -e 'N' -e 's/
/ /' input.dat執行上述命令後 , 其輸出的結果如下: The UNIX Operating System4.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 檔內容如下: TheUNIXSystem說明: 在命令列上 以選項 -n , 將資料輸出的控制權(參照[section2.5])轉給指令。 利用函式引數 N 將偶數行新增至 pattern space 內奇數行後。 利用函式引數 P 將 pattern space 內的第一行(奇數行)輸出。 在奇數行輸出後 , pattern space 內剩下的資料行(偶數行)則被放棄輸出。最後 , 整個輸出只有原先的奇數行資料。 sed 命令列 : sed -n -e 'N' -e 'P' infro.dat執行上述命令後 , 輸出的結果如下 : TheSystem4.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.dat4.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 檔的內容如下 :ABC說明: 用指令 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}/bb p1}' input.dat4.25 t 基本上 , 函式引數 t 與 函式引數 b 的功能類似 , 除了在執行 t 的 branch 前 , 會先去測試其前的替換指令有沒有執行替換成功外。在 script file 內的情況如下: ...編輯指令m1:記號編輯指令m2...s/.../.../[address1,[address2]]t [記號]編輯指令m3其中 , 與函式引數 b 不同處在於 , 執行函式引數 t branch 時 , 會先檢查其前一個替換指令成功與否。如成功 , 則執行 branch ; 不成功 , 則不 branch , 而繼續執行下一個編輯指令 , 例如上面的編輯指令m3。 例: 題目 : 將 input.dat 檔中資料 A1 替換成 C1、C1 替換成 B1、B1 替換成 A1。input.dat 檔的內容如下: 代號B1A1B1C1 A1C1說明 : input.dat 檔中全部資料行只需要執行一次替換動作 , 但為避免資料被替換多次 , 所以利用函式引數 t 在 sed script 內形成一類似 C 語言中 case statement 結構 , 使每行資料替換一次後能立即用函式引數 t 跳離替換編輯。 sed 命令列 : sed -e '{s/A1/C1/ts/C1/B1/ts/B1/A1/t}' input.dat
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-944824/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle函式手冊(轉)Oracle函式
- ORACLE分析函式手冊(轉)Oracle函式
- ORACLE分析函式手冊二(轉)Oracle函式
- 學習javaScript必知必會(1)~js介紹、函式、匿名函式、自呼叫函式、不定長引數JavaScriptJS函式
- MT7682晶片手冊資料, MT7682處理器引數介紹晶片
- stoi函式介紹函式
- 函式引數 引數定義函式型別函式型別
- zblog獲取GET/POST等值函式“GetVars”引數和使用方法介紹函式
- 函式文件或者手冊函式
- oracle常用函式介紹Oracle函式
- funclib函式庫介紹函式
- cuda函式庫介紹函式
- jmeter引數化介紹JMeter
- Javascript函式引數求值——Thunk函式JavaScript函式
- 函式基礎和函式引數函式
- javascript函式中with的介紹JavaScript函式
- Dart建構函式介紹Dart函式
- 4. PHP 函式 strrchr ()PHP函式
- 函式、引數、解構函式
- 函式引數詳解函式
- 3.3.2 函式的預設引數和佔位引數 函式過載函式
- 快速介紹幾個JS函式JS函式
- ES6 Generator 函式介紹函式
- 原創:oracle聚合函式介紹Oracle函式
- javascript中generator函式的介紹JavaScript函式
- javascript高階函式的介紹JavaScript函式
- python---函式引數、變數Python函式變數
- 聯發科MT6737 datasheet,MT6737晶片手冊,MT6737處理器引數介紹晶片
- 【手摸手玩轉 OceanBase 172】清理備份相關引數介紹
- Arduino參考手冊-函式和變數及電路圖UI函式變數
- Python函式引數總結Python函式
- JavaScript函式傳遞引數JavaScript函式
- 函式的引數傳遞函式
- 陣列作為函式引數陣列函式
- 程式中的函式引數函式
- 函式中引數傳值函式
- ES6函式引數函式
- python函式變長引數Python函式
- 函式的動態引數 及函式巢狀函式巢狀