2013年11月25日 星期一

sed

sed (stream editor) 是一個 stream 編輯軟體,直接對檔案一行一行處理。不像一般編輯軟體將檔案載入 buffer 後進行處理。sed 支援正規表示式及流程控制,可視為一種小型指令檔語言。

指令格式
  • sed [選項] [-e] '編輯命令' [輸入檔]
  • sed [選項] -e '編輯命令1' -e '編輯命令2' [輸入檔]
  • sed [選項] -f 命令檔 [輸入檔]
編輯命令放在選項 -e 之後,如果只有一個編輯命令可省略 -e。編輯命令也可以放在選項 -f 指定的命令檔裡。其它常用選項:
  • -n:不自動列印。預設除非刪除,不然每行都會印出。加了 -n 選項,
  • -i:直接修改檔案內容
編輯命令格式:
  • [位址[,位址]]動作

位址

用來決定哪些行套用動作,不然每行都套用。有些動作不能有位址;有些可以有一個,指定符合的那些行;有些可以有兩個用「,」隔開,標示行的範圍。位址格式如下:

  • 數字:代表行數
  • 數字~step數字開始每 step 行。在 GNU 數字可以為 0。
  • /正規表示式/\c正規表示式c:比對符合的行,c 是任何字元。
  • $:最後一行
  • 整組位址後加「!」代表否定
GNU 額外支援的位址:
  • 0,位址位址正規表示式的比對,讓第 1 行可作為結束。
  • 位址,+N位址到其之後 N 行。
  • 位址,~N位址到其之後行號為 N 倍數的行。

動作

不能有位址的動作
  • #comment:整行為註解。
  • : label:供動作 bt 跳躍的 label。
  • }:{ } 命令區塊的結束。
沒位址或單一位址的動作
  • =:印出行號。
  • a[字串]:(append) 後面附加行放字串。新增多行,行尾用 \ 後換行。
  • i[字串]:(insert) 插入新行,類似 a,但是新增在前面。
  • q[結束碼]:
  • Q[結束碼]:
  • r檔名:後面附加檔案裡的內容。
  • R檔名:
接受範圍的動作:
  • {:命令區塊開始。
  • b[label]:(branch) 跳到 label 或命令檔最後。
  • c[字串]:(change) 整行取代
  • d:(delete) 整行刪除
  • D: 
  • l:類似 p
  • l[width]:
  • n
  • N:合併下一行。例如 sed 'N;s/\n/ /' 合併下行,並把換行取代成空白
  • p:列印,通常搭配選項 -n 使用
  • P
  • s/正規表示式/替代文字/[取代選項]:(substitute) 取代,比對正規表示式符合的話用替代文字取代。
    • 「/」可以用其它符號代替,例如「,」。
    • 替代文字」可以包含的特殊符號
      • &:整個比對符合的部份
      • \1 到 \9:比對的群組
      • \L:改為小寫
      • \l:首字改為小寫
      • \U:改為大寫
      • \u:首字改為大寫
    • 取代選項
      • 未指定只取代一行中第一個符合
      • g:global,一行中全部的符合都取代
      • 數字:一行中第幾個符合才取代
      • w file:寫到檔案
    • 範例
      • s/^/#/:每行開頭插入 #。
  • t[label]:(test) 執行 s 如果成功則跳到 label 或命令檔最後。
  • T[label]:同 t,GNU 擴展。
  • w
  • W
  • y/source/dest/:

使用保留空間的動作

保留空間 (hold space) 是一個另外的儲存空間,用來記憶內容。這些動作都接受位址範圍。
  • g:取代為保留空間內容
  • G:後面附加保留空間內容
  • h:覆蓋保留空間
  • H:附加到保留空間
  • x:跟保留空間內容互相交換

範例:pattern/hold space的處理

一系列編輯命令用「;」隔開。 

範例

  • sed 's/\(NAME=\).*/\1abc/g' config.file:將設定檔 config.file 中的 NAME= 設為 abc
  • sed -ne '/MHz/ { /disabled\|passive\|radar/d; s/.*\[//; s/\].*//; p; q }')
  • sed ':a;/0$/{N;s/\n//;ba}':迴圈執行,如果目前行以 '0' 結束,則合併下一行,並移除換行
  • Shell 變數字串處理
  • 目錄檔案字串替換
  • 多行處理:http://www.study-area.org/cyril/scripts/scripts/node57.html
  • 跳躍:http://www.study-area.org/cyril/scripts/scripts/node58.html
  • 多檔處理:http://www.study-area.org/cyril/scripts/scripts/node59.html

參考來源

延伸閱讀:
http://www.tldp.org/LDP/abs/html/

參考:Shell Script 文章

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...