參考 http://wanggen.myweb.hinet.net/ach3/ach3.html
sed 和 awk 共通的運作方式是:只要符合「樣式」的資料列,就對它執行指定的「動作」。因此,瞭解樣式的基本語法,運用 sed 和 awk 才能得心應手。
所以你必須透徹了解正規表示式:
正規表示式
符號代表的條件敘述, 滿足條件才是符合「樣式」
. 一點代表一個字元
^ 在列首
$ 在尾部
[...] 字元集合 ### Ex. [A-Z] A到Z之間任一字元 ; [ABc] A, B, c三者之間任一字元
* 出現 0 個以上
\{...\} 指定符合的個數 ### Ex. :\{3,5\} 表示前面的字元有 3 到 5 個。[a-z]\{3,5\}代表以小寫字母組成的字串,長度是 3~5。
awk
像是if(...) {...} , 符合條件時會執行指定動作
像是if(...) {...} , 符合條件時會執行指定動作
awk 為一直譯語言(Interpreter),大量引用 C 語言的語法,取 C 語言對文字處理和輸出格式的精華,再加上支援原始 C 語言所沒有的對正規表示法的匹配和關聯矩陣(Associative Arrays)的支援。
因此 awk 和 C 語言應用上最大的差別為 C 語言指令和語法多而複雜,而 awk 小而精簡,用來處理和計算用文字記錄的資料和文字的排版。
1980 年代 awk 曾很流行,一直到約 1990 才逐漸被另一通用的直譯語言 Perl 所瓜分。
以下是 awk 常用的作用格式:
- awk「樣式」檔案:把符合樣式的資料列顯示出來。
- awk '{動作}' 檔案:對每一列都執行{}中的動作。
- awk '樣式{動作}' 檔案:對符合樣式的資料列,執行{}中的動作。
sed
sed 的動作為一次只讀一行並去掉結尾的換行到暫時的緩衝區(buffer)中,此暫時緩衝區稱為〝pattern space〞,接著處理完成後會把 pattern space 的內容送往螢幕後清空 pattern space 再去處理下一行,這樣不斷重複直到檔案結束。
sed 每個參數之間預設分隔符號(delimiter)是用〝/〞來區別如 sed 's/OLD/NEW/g' flie,但如要搜尋樣板有〝/〞會和分隔符號混在一起如再加上跳脫字元〝\〞會變得好像火星文看不懂。
例如要把 Linux 路徑〝/abc/wxy〞改為 WINDOWS 路徑表示法的〝\abc\wxy〞,sed 的寫法為 sed 's/\//\\/g' ,真的不易一眼看出什麼是什麼,
故 sed 可用除空白,換行以外的字元(英文字母或數字或符號皆可)來當分隔符號,只要前後一致即可。
$ echo 'this is a apple' | sed 's:a:AN:' <- 將〝a〞改為〝AN〞(用〝:〞當 delimiter)
this is AN apple
$ echo '/home/frank/' | sed 's#/#\\#g' <- 將〝/〞改為〝\〞(用〝#〞當 delimiter)
\home\frank\
要連續執行多個處理, [COMMAND]用 -e
Ex.
$ sed -e 's/a/A/' -e '/this/ q' -e 'l' MyFile <- 多個 sed CMD 要使用,就一定要用〝-e〞
大量改檔名http://eric0703.pentaxfans.net/2285
沒有留言:
張貼留言