阿旺的 Linux 開竅手冊

 基礎篇    進階篇    補腦篇    指令索引  


HY-STAR's  Ads IWS's Ads


版權所有, 引用請註明出處

 進階篇

Advanced Chapter 4 : sed

A4.0 sed 簡介
A4.1 sed 檔案字串修改
        sed 基本用法
        sed 進階用法
            delimiter 分隔符號
            ADDRESS 位址範圍
            OPTION 選項
            FLAG 旗幟
            流程控制
            COMMAND 命令





















sed


A4.0 sed 簡介

sedawk 這兩大工具時常被拿來相提並論,因二者一樣強大和對正規表示法有良好的支援。也各自有自己專屬的腳本語言(script language),sed 主要功能為自動化的修改文字檔,而 awk 可想像為超輕量級的 C 直譯語言(Interpreted language)屬通用,偏向統計和需輸出重新排版的應用。

國內的中文書籍或網站在介紹 sedawk 多只講解簡單的應用和含糊帶過,且天下文章一大抄內容都大同小異,對想深入應用的 user 常找不到更詳細的資料。別太天真認為參考 man page 就可以,man page 是給已熟悉的人參考用的,用 man page 學 sedawk 就好像用英文字典學英文會話。所以這嘗試盡可能的把 sedawk 所有的功能和潛力寫出來。如是輕度的使用者不想浪費太多的時間,參考 sed 基本用法 awk 基本用法應足以應付 90 % 以上的需求。

^ back on top ^





A4.1 sed 檔案字串修改

grep
雖可利用功能強大的正規表示法搜尋檔案中的字串,但沒辦法對搜尋到的字串進行刪除,取代或插入等編輯動作;補足 grep 編輯功能的工具就是 sed,更甚者 sed 可程式化的特性常用來自動化的修改文字檔。

雖然 vi 也可用來搜尋/修改檔案內容,但要人工把檔案打開,改完再存檔人力要介入很深,如熟悉 sed 的操作這些都可自動化的完成。例如公司搬家,有舊公司地址的表格文件一堆,如善用 sed 就可有效率的自動把所有文件表格上的舊地址改新地址。

sed 用法有點抽象,故對基本用法和每一參數分別說明。

sed 基本用法
sed 和其他功能強大的指令一樣,通常功能愈強語法就愈複雜和抽象,sed 也是如此。如有常自動化的修改文字檔,是值得一學的好工具。

sed 基本的用法如下: 「sed [-OPTION] [ADD1][,ADD2] [COMMAND] [/PATTERN][/REPLACEMENT]/[FLAG] [FILE]」。

但光看其晦澀不明的語法是不太可能會使用的,故先舉個例子,一例解千文。

例如我要把檔案〝MyFile.txt〞的 1~8 行中的〝The〞或〝the〞改為大寫的〝THE〞可如下:
sed  -e '1,8 s/ [Tt]he/ THE/ g' MyFile.txt   
   
   
項 

址 

令 

板 

代 

幟 

案 

因每一欄參數都可能複雜和抽象,有時 sed 會解讀錯誤,故一般除檔案和選項以外的參數都會用單引號「'」把其括起來。

上例中如位址欄省略是代表全部文字,而選項〝-e〞為預設故普通的應用可省略,故如沒加任何選項預設是以是 sed -e 選項來執行 (選項〝-e〞for script interpret)。

sed 最基本的命令為搜尋樣板並取代〝s〞,基本用法為〝s/樣板(PATTERN)/取代(REPLACEMENT)/〞(和 vi 取代指令是一樣的),而樣板可為合法的正規表示法或一般的字串。

另外如欲搜尋和取代的樣板為單字(word),可在樣板和取代字串前加一空隔(因單字間有空隔),例如有一句子為〝This is a book〞,我只想把單字〝is〞變大寫,但單字〝This〞也有子串〝is〞,處理不好輸出會變〝ThIS IS a book〞,或用正規表示法的單字配匹來匹配也是方法之一,如熟悉正規表示法應還有更多技巧可用。

例:
$ echo 'This is a book' | sed 's/is/IS/g' ←將字串〝is〞改為〝IS〞(單字前沒加空隔)
ThIS IS a book
$ echo 'This is a book' | sed 's/ is/ IS/g' ←樣板和取代前加一空隔
This IS a book
$ echo 'This is a book' | sed 's/\<is\>/IS/g' ←用正規表示法的單字配匹
This IS a book
$ sed 's/\<is\>/IS/g' fileA ←檔案〝fileA〞把〝is〞改為〝IS〞
$ sed 's/\<is\>/IS/g' fileA fileB fileC ←也可一次輸入好幾個檔案

sed FLAG 旗幟〝g〞為取代全部,如無此 FLAG 只取代搜尋到的第一個樣板此行就停止而去處理下一行。

sed 全名為〝Stream EDitor〞,故上例中的變更只輸出到螢幕並不會改變檔案本身,如要存檔要把螢幕的輸出再重定向到檔案,例如 sed 's/can/CAN/' INPUT_FILE > SAVE_FILE

例:
$ echo 'this is a apple' | sed 's/a/AN/' ←將〝a〞改為〝AN〞(只取代搜尋到的第一個樣板就停止)
this is AN apple
$ echo 'this is a apple' | sed 's/a/AN/g' ←多加 FLAG〝g〞故輸的〝apple〞也變〝ANpple〞
this is AN ANpple
$ echo 'this is a apple' | sed 's/ is//g' ←將單字〝is〞刪掉(刪掉用空字串來取代)記得〝is〞前要加一空格寫成〝 is〞,不然〝this〞串中的〝is〞也會被刪除)
this a apple
$ cat my_file.txt | sed '4,5 s/Google/Yahoo/g' > new.txt ←將檔案〝my_file.txt〞中第 4~5 行中的字串〝Google〞改〝Yahoo〞並存檔為〝new.txt〞
$ sed '4,5 s/Google/Yahoo/g' < my_file.txt > new.txt ←功能同上

如要搜尋和取代的樣板不只一個,可用選項〝-e〞或管線再處理。

例:
$ echo 'this is a apple' | sed 's/a/an/' | sed 's/apple/APPLE/' ←將〝a〞改為〝an〞&〝apple〞改為大寫
this is an APPLE
$ echo 'this is a apple' | sed -e 's/a/an/' -e 's/apple/APPLE/' ←功能同上



^ back on top ^





sed 進階用法



^ back on top ^